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 в качестве легкого интерфейса журнала.

Другие вопросы по тегам