您可以将根记录器设置为 TRACE 级别(所有消息)并在控制台上放置一个 ThresholdFilter,以便在控制台上只显示一些消息。
此配置将仅将 ERROR 消息记录到控制台,同时将所有消息(TRACE、DEBUG、INFO、ERROR...)记录到 debug.txt 文件。控制台和文件中都记录了错误和更高级别的消息:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="ERROR">
<appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="%d %-5p %C{2} (%F:%L) - %m%n" />
</Console>
<File name="DEBUG_FILE" fileName="debug.txt">
<PatternLayout pattern="%d %-5p %C{2} (%F:%L) - %m%n" />
</File>
</appenders>
<loggers>
<root level="trace">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
</root>
</loggers>
</configuration>
顺便说一句,请注意您的模式布局包含需要位置信息的转换模式(准确地说是%C、%F 和 %L)。这意味着对于每条日志消息,log4j2 需要对堆栈进行快照,然后遍历堆栈跟踪以查找进行日志记录的类和方法。
这是非常非常缓慢的。
同步日志记录将慢 2-5 倍,异步日志记录慢 4-20 倍。
如果性能不是问题,那也没关系,但这绝对是需要注意的事情。我个人只使用 %c (记录器名称),并且我的应用程序的日志消息足够独特,我可以快速找到消息的来源。只是我的2美分。
--- 更新 2013-04-27 --- 我已经学会了一种更简单的方法来做到这一点:你可以在 appender-ref 上设置一个级别。
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="debug">
<appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d %-5p %c{2} - %m%n" /> <!--without location-->
</Console>
<File name="DEBUG_FILE" fileName="debug.txt">
<PatternLayout pattern="%d %-5p %c{2} - %m%n" />
</File>
</appenders>
<loggers>
<root level="debug">
<appender-ref ref="CONSOLE" level="ERROR" />
<appender-ref ref="DEBUG_FILE" />
</root>
</loggers>
</configuration>