log4j не читает log4j.properties?

Я унаследовал приложение 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 для бродячей отладки. Сейчас работаю над этим, и я обновлю этот вопрос, если что-то изменится. Я почти ожидаю, что ответом будет что-то тривиально очевидное, чего я просто не уловил из-за неопытности.


person Arne    schedule 25.05.2017    source источник
comment
Вы пробовали вручную настроить log4j с помощью параметров виртуальной машины? вы можете сделать это, установив -Dlog4j.configuration=file:///path/To/Project/src/main/resources/log4j.properties. (Если это сработает, это может означать, что ваш класс не берет файл)   -  person Ishnark    schedule 25.05.2017
comment
Также см. здесь: на самом деле это может быть для вас более полезным.   -  person Ishnark    schedule 25.05.2017
comment
спасибо за подсказку - любопытно, что установка параметров виртуальной машины явно не сработала. Я включил Dlog4j.debug, и хотя файл свойств применяется к ряду других запускаемых приложений, то, которое я пытаюсь настроить, полностью пропускается.   -  person Arne    schedule 26.05.2017


Ответы (1)


Иногда log4j не загружается автоматически при запуске tomcat только потому, что сервер не может видеть файл свойств log4j. Требуется вручную установить путь к конфигурации файла свойств log4j как параметр java или параметры виртуальной машины eclipse или intellij. В моем случае мне пришлось сделать что-то вроде (я на окнах)

    -Dlog4j.configuration="file:D:\Users\Projets\api\WebContent\WEB-INF\config\log4j_dev.xml"
person onlyme    schedule 27.01.2021