Проблема Tomcat Log4J - не удалось найти ни одного дополнительного устройства - PullRequest
1 голос
/ 06 сентября 2011

У нас очень простая настройка log4j для tomcat.У нас есть только один файл log4j.properties, и мы добавили флаг отладки при запуске, чтобы убедиться, что используется правильный файл log4j.properties.

Вот наша конфигурация:

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{ABSOLUTE} %5p %.20t:%c{1}:%L - %m%n
log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
log4j.appender.stdout2.Target=System.out
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout2.layout.ConversionPattern=%d{ABSOLUTE} %5p %.20t:%c{1}:%L - %m%n

log4j.rootLogger=INFO, stdout
log4j.logger.com.rei.framework.model.Table=INFO, stdout2
log4j.logger.com.rei.framework.view.SqlGridDisplayGroup=WARN, stdout2

Проблема, с которой мы сталкиваемся, заключается в том, что, если я не перечислю регистратор для каждого класса, я получу эту ошибку:

log4j:WARN No appenders could be found for logger (com.rei.util.DatabaseConnection).
log4j:WARN Please initialize the log4j system properly.

В соответствии с документами регистратор ROOT должен быть регистратором по умолчанию для любых классов без определенной строки конфигурацииТем не менее я получаю много предупреждений «Не найден ни один из них», если я не перечисляю каждый класс в конфигурации.С сотнями классов в нашем проекте это невозможно отремонтировать.

Мы создаем регистратор таким образом внутри каждого класса:

static Logger logger = org.apache.log4j.Logger.getLogger(Myclass.class);

Любые идеи, почему не выбирается корневой регистратор в этой конфигурациина неопределенные классы?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

Вы правы, log4j.rootLogger должен быть конфигурацией по умолчанию. Поведение, которое вы получаете, происходит, когда у вас нет линии

log4j.rootLogger=INFO, stdout

в вашем файле. Я проверил с вышеуказанным файлом, и это работает для меня. Следовательно, в файле, который вы фактически используете, у вас нет этой строки или вы используете другую версию log4j от меня (я пробовал с 1.2.9 до 1.2.16).

Когда вы указываете -Dlog4j.debug в командной строке, вы должны получить вывод вроде:

log4j: Using URL [file:/C:/developpement/mjf-workspace/Stackoverflow/lib/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/C:/developpement/mjf-workspace/Stackoverflow/lib/log4j.properties
log4j: Could not find root logger information. Is this OK?
log4j: Parsing for [com.rei.framework.model.Table] with value=[INFO, stdout2].
log4j: Level token is [INFO].
log4j: Category com.rei.framework.model.Table set to INFO

Вы получили строку:

log4j: Could not find root logger information. Is this OK?

Если вы получаете это, значит, что-то не так с вашим файлом log4j.properties. Это Java-класс, который я использую для тестирования:

package uk.co.farwell.stackoverflow;

import org.apache.log4j.*;

public class Log4jTest {
    static Logger logger = Logger.getLogger(Log4jTest.class);

    public static void main(String args[]) {
        logger.debug("hello Log4jTest");
    }
}

РЕДАКТИРОВАТЬ: Оказывается, что класс Logger, который вы импортируете в класс и, таким образом, используете это регистрация общих Apache, а не log4j. В общем журнале Apache используется rootCategory, а не rootLogger (см. Настройка Log4J :

log4j.rootCategory=INFO, stdout

Вот почему он не берет регистратор по умолчанию. Попробуйте добавить эту строку в ваши log4j.properties.

Не стоит смешивать ваши каркасы логирования, поэтому выберите один и придерживайтесь его. Если регистрация общего пользования работает для вас, используйте это. Но не смешивайте и не сочетайте в своем коде. Это плохая идея, которая приводит к путанице.

Лично я всегда использую slf4j . slf4j позволяет вам иметь одну конфигурацию для нескольких фреймворков, поэтому я использую ее по умолчанию. slf4j часто является обязательным, потому что сторонние библиотеки используют протоколирование общего достояния или даже протоколирование Java, и вы не можете это изменить. slf4j использует мост, чтобы все оказалось в одном и том же месте.

Он также имеет ряд преимуществ, таких как параметризованное ведение журнала .

Рекомендация: используйте slf4j.

1 голос
/ 06 сентября 2011

Убедитесь, что ваш log4j.properties находится в пути к классам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...