Я унаследовал приложение Mavenized Java / Tomcat, и мне не удается заставить ведение журнала работать должным образом. Наверное, это очевидно, но как раз так сказано - я новичок в Java.
Проблема кажется в том, что log4j не читает свой собственный файл конфигурации (log4j.properties). Файл доступен в пути к классам и (afaik) отформатирован правильно.
Ниже мой файл log4j.properties. Как бы то ни было, я скопировал его дословно с этого сообщения на сайте Mkyong, на всякий случай мой исходный файл .properties был каким-то образом искажен.
# Root logger option
log4j.rootLogger=DEBUG, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Дорожка :
/src/main/resources/log4j.properties
Объявление регистратора в родительском классе:
public class MyParentClass extends HttpServlet{
protected static final String CHARSET = "UTF-8";
static Logger logger = Logger.getLogger(MyParentClass.class);
Вот код, который вызывает Logger / log4j. Согласно FAQ по log4j, проблемы с путями к классам являются частым источником проблем в WAR apps, поэтому я убедился, что класс может загрузить ресурс (log4j.properties) и распечатать его в STDOUT.
public class MyChildClass extends MyParentClass {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//testing output
System.out.println("SYSTEM.OUT.PRINTLN");
logger.info("LOGGER.INFO");
logger.debug("LOGGER.DEBUG");
logger.trace("LOGGER.TRACE");
logger.error("LOGGER.ERROR");
logger.warn("LOGGER.WARN");
// reading log4j.properties
java.io.InputStream propertiesStream = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
java.util.Scanner s = new java.util.Scanner(propertiesStream).useDelimiter("\\A");
String result = s.hasNext() ? s.next() : "";
// writing log4j.properties to stdout
System.out.println("---CONTENTS OF log4j.properties---");
System.out.println(result);
System.out.println("---END CONTENTS---");
Результаты в:
SYSTEM.OUT.PRINTLN
log4j:WARN No appenders could be found for logger (com.company.client.project.web.MyParentClass).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
---CONTENTS OF log4j.properties---
# Root logger option
log4j.rootLogger=DEBUG, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
---END CONTENTS---
Весь видимый результат исходит из явных System.out.println()
вызовов.
Еще одна потенциально важная точка данных: сообщение об ошибке log4j appenders («Не удалось найти никаких приложений для регистратора») только появляется из-за вызова logger.error()
. Если он удален или прокомментирован, предупреждение исчезнет.
Я еще не настроил точки останова для пошагового выполнения потока выполнения, потому что код работает на управляемом бродяге Ubuntu, и я не настроил свою IDE для бродячей отладки. Сейчас работаю над этим, и я обновлю этот вопрос, если что-то изменится. Я почти ожидаю, что ответом будет что-то тривиально очевидное, чего я просто не уловил из-за неопытности.
-Dlog4j.configuration=file:///path/To/Project/src/main/resources/log4j.properties
. (Если это сработает, это может означать, что ваш класс не берет файл) - person Ishnark   schedule 25.05.2017