根据log4j文档,如果我为com.a.b.c
包定义一个记录器配置,级别为ERROR
,根记录器级别设置为DEBUG
,则只有ERROR日志应该来自com.a.b.c
中的类,而其他类应该打印DEBUG
日志。因此,我有下面的log4j2-test.xml。
然而,在我的情况下,com.a.b.c
类的INFO
级日志仍然被打印。我有误解什么吗?我应该怎么做,使类在com.a.b.c
打印ERROR
日志,而所有其他类打印INFO
日志?
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug" name="PropertiesConfig" packages="org.apache.logging.log4j.test">
<Properties>
<Property name="basePath">target/</Property>
</Properties>
<ThresholdFilter level="trace"/>
<Appenders>
<Console name="consoleLogger" target="SYSTEM_OUT">
<PatternLayout pattern="%d{dd-MM-yyyy HH:mm:ss.SSS} %style{[%t]}{magenta} %highlight{%-5level}{TRACE=cyan, DEBUG=green, INFO=yellow, WARN=blue, ERROR=red} [%-60.60c] : %m%n" />
</Console>
<File name="fileLogger" fileName="${basePath}app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] : %msg%n" />
</File>
</Appenders>
<Loggers>
<Root level="INFO" >
<AppenderRef ref="consoleLogger" />
<AppenderRef ref="fileLogger" />
</Root>
<Logger name="com.a.b.c" level="ERROR" additivity="false">
<AppenderRef ref="consoleLogger" />
<AppenderRef ref="fileLogger" />
</Logger>
</Loggers>
</Configuration>
我明白了。有问题的类(奇怪的是)在获取记录器时没有使用自己的类名。通常它是LoggerFactory.getLogger(com.a.b.c)
,但在我的情况下,类正在做LoggerFactory.getLogger(java.io.Console)
,因此我们的记录器配置<Logger name="com.a.b.c" level="ERROR" additivity="false">
将不适用于来自这个类的日志。我必须为类java.io.Console
添加一个记录器配置。