在我的工作中,我继承了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...");
我错过了什么?
答案 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的任何消息。