1

在我的工作中,我继承了 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...");

我错过了什么?

4

2 回答 2

4

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

logger.info("my message");

在这种情况下,您的消息将不会被打印,因为它被root定义为打印警告的记录器过滤掉了。

Log4J 中的记录器存储为分层结构。root记录器是这棵树的入口点。每个记录器根据配置的级别过滤日志消息。因此,如果上级记录器(在您的情况下为根)过滤日志消息,它甚至不会到达下级记录器,也绝对不会到达附加程序。

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

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

还有一个注意事项。Log4J 已被其创建者弃用。如果您现在开始使用Logback作为记录器,将SLF4J作为轻量级日志接口。

于 2013-05-24T11:03:18.153 回答
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...");

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

于 2013-05-24T16:21:45.660 回答