logging错误到stderr和debugging信息到log4j的标准输出

我想使用apache log4j将日志logging添加到我正在开发的应用程序中。 在这一点上,我想redirect所有日志消息的级别INFO和降低(TRACE,DEBUG)到标准输出和所有其他日志消息从警告和以上(错误,致命)为标准错误。 例如:

... logger.info("Processing at some point"); // must be written to stdout logger.debug("Point x was processed"); // must be written to stdout logger.warn("Incorrect point config"); // must be written only to stderr logger.error("Exception occurred at point x"); // must be written only to stderr 

那么我的log4j.properties文件应该是什么? 在这里,它看起来如何:

 log4j.rootLogger=DEBUG, stdout, stderr # configure stdout # set the conversion pattern of stdout # Print the date in ISO 8601 format log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Threshold = DEBUG log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n # configure stderr # set the conversion pattern of stdout # Print the date in ISO 8601 format log4j.appender.stderr = org.apache.log4j.ConsoleAppender log4j.appender.stderr.Threshold = WARN log4j.appender.stderr.Target = System.err log4j.appender.stderr.layout = org.apache.log4j.PatternLayout log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 

上述configuration的问题是logger.error()…也被打印在标准输出。

Per Jon Skeet之前在Post的post

不幸的是没有最大的阈值,所以无论你在哪里得到debugging信息,你也会收到警告信息。 国际海事组织,这有点痛苦。

解决以下属性文件格式。 诀窍是获得正确的filter定义。 Log4j属性信息在这里

原来的尝试,修改过滤WARN&ERROR:

 log4j.rootLogger=TRACE, stdout, stderr # configure stdout # set the conversion pattern of stdout # Print the date in ISO 8601 format log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Threshold = TRACE log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n log4j.appender.stdout.filter.filter1=org.apache.log4j.varia.LevelRangeFilter log4j.appender.stdout.filter.filter1.levelMin=TRACE log4j.appender.stdout.filter.filter1.levelMax=INFO # configure stderr # set the conversion pattern of stdout # Print the date in ISO 8601 format log4j.appender.stderr = org.apache.log4j.ConsoleAppender log4j.appender.stderr.Threshold = WARN log4j.appender.stderr.Target = System.err log4j.appender.stderr.layout = org.apache.log4j.PatternLayout log4j.appender.stderr.layout.ConversionPattern = %-5p %d [%t][%F:%L] : %m%n 
  1. 而不是使用.propertiesconfiguration,您必须使用.xmlconfiguration。
  2. 在.xmlconfiguration文件中,放入一个名为“filter”的types为“org.apache.log4j.varia.LevelRangeFilter”的元素,并设置其参数LevelMaxLevelMin

例如,下面的.xmlconfiguration定义了两个appender:stdout,stderr。 stdout会将所有级别小于或等于INFO的日志打印到stdout,并且stderr会将级别大于INFO的所有日志打印到stderr。

 <?xml version="1.0" encoding="UTF-8"?> <!-- Document : log4j.xml Created on : 13 Δεκέμβριος 2011, 3:55 μμ Author : elitex Description : Purpose of the document follows. --> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > <log4j:configuration> <appender name="stderr" class="org.apache.log4j.ConsoleAppender"> <param name="threshold" value="warn" /> <param name="target" value="System.err"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" /> </layout> </appender> <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> <param name="threshold" value="debug" /> <param name="target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p %d [%t][%F:%L] : %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="debug" /> <param name="LevelMax" value="info" /> </filter> </appender> <root> <priority value="debug"></priority> <appender-ref ref="stderr" /> <appender-ref ref="stdout" /> </root> </log4j:configuration> 

欲了解更多信息,请看http://www.laliluna.de/articles/posts/log4j-tutorial.html

另一个使用log4j2的ThresholdFilter标记的例子。

 <Console name="ConsoleERR" target="SYSTEM_ERR"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level - %msg%n"/> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> </Console> 

看文档 。