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

时间:2013-05-24 10:51:10

标签: java logging log4j consoleappender

在我的工作中,我继承了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 个答案:

答案 0 :(得分:4)

不幸的是,您还没有发送实际打印邮件的代码。但是我可以假设你尝试做这样的事情:

logger.info("my message");

在这种情况下,您的消息将不会被打印,因为它被root记录器筛选出来,用于打印警告。

Log4J中的记录器存储为分层结构。 root记录器是此树的入口点。每个记录器根据配置的级别过滤日志消息。因此,如果上层记录器(在您的情况下为root)过滤日志消息,它甚至不会到达较低级别的记录器,并且肯定不会到达appender。

您的解决方案是定义根记录器以允许所有消息。

最后一点:您是否有任何特殊原因以编程方式配置记录器?可以使用属性或(更好的)xml文件配置Log4J。看一下这个document

还有另一个说明。 Log4J已被其创建者弃用。如果您现在开始使用Logback作为记录器,SLF4J作为轻量级日志界面。

答案 1 :(得分:0)

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

由于loggerRECORD的additivity设置为false,appender成功打印从INFO到ERROR的任何消息。