简体   繁体   中英

log4j - Why doesn't my appender show message?

At my work, I have inherited of the maintenance of a satandalone application.
The following code configures Log4J but no messages can be seen on the console.

    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...");

What am I missing ?

Unfortunately you have not sent the code that actually prints the message. However I can assume that you try to do something like this:

logger.info("my message");

In this case your message will not be printed because it is filtered out by root logger defined to print warnings.

Loggers in Log4J are stored as hierarchical structure. The root logger is the entry point to this tree. Each logger filters log messages according to configured level. Therefore if upper level logger (root in your case) filters log message it even does not arrive to lower level logger and definitely does not arrive to appender.

The solution for you is to define root logger to allow ALL messages.

And the last note: do you have any special reasons to configure logger programmatically? Log4J can be configured using properties or (better) xml file. Take a look on this document .

And yet another note. Log4J has been deprecated by its creator. If you are starting now go forward to Logback as a logger and SLF4J as a light weight log interface.

Thanks to AlexR, here how I solved my problem:

    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...");

Since additivity is set to false for loggerRECORD , the appender sucessfully print any message from INFO to ERROR.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM