log4j - Почему мой appender не показывает сообщение?
На своей работе я унаследовал от поддержки приложения Satandalone.
Следующий код настраивает Log4J, но на консоли не видно никаких сообщений.
LogManager.resetConfiguration();
PatternLayout layout = new PatternLayout();
layout.setConversionPattern("RECORD-BACKEND / (%-5p) %m (%F:%L)%n");
ConsoleAppender stderr = new ConsoleAppender();
stderr.setTarget(ConsoleAppender.SYSTEM_ERR);
stderr.setLayout(layout);
stderr.addFilter(new CurrentThreadLogFilter());
stderr.setThreshold(Level.INFO);
stderr.activateOptions();
Logger loggerRECORD = getLoggerRECORD();
loggerRECORD.setAdditivity(false);
loggerRECORD.addAppender(stderr);
Logger root = Logger.getRootLogger();
root.setLevel(Level.WARN);
root.addAppender(stderr);
// some lines forward ...
loggerRECORD.info("Process starting...");
Что мне не хватает?
2 ответа
Спасибо AlexR, вот как я решил свою проблему:
LogManager.resetConfiguration();
PatternLayout layout = new PatternLayout();
layout.setConversionPattern("RECORD-BACKEND / (%-5p) %m (%F:%L)%n");
ConsoleAppender stderr = new ConsoleAppender();
stderr.setTarget(ConsoleAppender.SYSTEM_ERR);
stderr.setLayout(layout);
stderr.addFilter(new CurrentThreadLogFilter());
stderr.setThreshold(Level.INFO);
stderr.activateOptions();
Logger loggerRECORD = getLoggerRECORD();
loggerRECORD.setLevel( /* get Log Level from env. */ );
loggerRECORD.setAdditivity(false);
loggerRECORD.addAppender(stderr);
Logger root = Logger.getRootLogger();
root.setLevel(Level.WARN);
root.addAppender(stderr);
// some lines forward ...
loggerRECORD.info("Process starting...");
Так как для аддитивности установлено значение false loggerRECORD
, приложение успешно распечатало любое сообщение от INFO до ERROR.
К сожалению, вы не отправили код, который фактически печатает сообщение. Однако я могу предположить, что вы пытаетесь сделать что-то вроде этого:
logger.info("my message");
В этом случае ваше сообщение не будет напечатано, потому что оно отфильтровано root
регистратор, определенный для печати предупреждений.
Регистраторы в Log4J хранятся в виде иерархической структуры. root
регистратор является точкой входа в это дерево. Каждый регистратор фильтрует сообщения журнала в соответствии с настроенным уровнем. Поэтому, если регистратор верхнего уровня (в вашем случае root) фильтрует сообщение журнала, он даже не попадает в регистратор более низкого уровня и определенно не поступает к appender.
Решение для вас состоит в том, чтобы определить root logger, чтобы разрешить ВСЕ сообщения.
И последнее замечание: есть ли у вас какие-либо особые причины для программной настройки логгера? Log4J может быть настроен с использованием свойств или (лучше) XML-файла. Посмотрите на этот документ.
И еще одна заметка. Log4J устарел своим создателем. Если вы начинаете сейчас, перейдите к Logback в качестве регистратора и SLF4J в качестве легкого интерфейса журнала.