在我的工作中,我继承了一个独立应用程序的维护。
以下代码配置了 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...");
我错过了什么?
最佳答案
很遗憾,您还没有发送实际打印消息的代码。但是我可以假设您尝试做这样的事情:
logger.info("我的消息");
在这种情况下,您的消息将不会被打印,因为它被定义为打印警告的 root
记录器过滤掉了。
Log4J 中的记录器存储为层次结构。 root
记录器是这棵树的入口点。每个记录器根据配置的级别过滤日志消息。因此,如果上层记录器(在您的情况下为根)过滤日志消息,它甚至不会到达下层记录器,并且绝对不会到达附加程序。
您的解决方案是定义根记录器以允许所有消息。
最后一点:您是否有任何特殊原因以编程方式配置记录器?可以使用属性或(更好的)xml 文件配置 Log4J。看看这个document .
还有一个注意事项。 Log4J 已被其创建者弃用。如果您现在开始,请转到 Logback作为记录器和 SLF4J作为一个轻量级的日志接口(interface)。
关于java - log4j - 为什么我的 appender 不显示消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16733292/