简体   繁体   English

log4j - 为什么我的appender没有显示消息?

[英]log4j - Why doesn't my appender show message?

At my work, I have inherited of the maintenance of a satandalone application. 在我的工作中,我继承了satandalone应用程序的维护。
The following code configures Log4J but no messages can be seen on the console. 以下代码配置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...");

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. 在这种情况下,您的消息将不会被打印,因为它被定义为打印警告的root记录器过滤掉。

Loggers in Log4J are stored as hierarchical structure. Log4J中的记录器存储为分层结构。 The root logger is the entry point to this tree. root记录器是此树的入口点。 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. 因此,如果上层记录器(在您的情况下为root)过滤日志消息,它甚至不会到达较低级别的记录器,并且肯定不会到达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. 可以使用属性或(更好的)xml文件配置Log4J。 Take a look on this document . 看一下这份文件

And yet another note. 而另一个说明。 Log4J has been deprecated by its creator. Log4J已被其创建者弃用。 If you are starting now go forward to Logback as a logger and SLF4J as a light weight log interface. 如果您现在开始, 请将Logback作为记录器,将SLF4J作为轻量级日志界面。

Thanks to AlexR, here how I solved my problem: 感谢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...");

Since additivity is set to false for loggerRECORD , the appender sucessfully print any message from INFO to ERROR. 由于loggerRECORD additivity设置为false,因此appender成功地将任何消息从INFO打印到ERROR。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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