配置
叠加性
也许希望去掉除com.foo.Bar
之外的所有TRACE输出。简单地更改日志级别不会完成任务。相反,解决方案是向配置添加新的记录器定义:
<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>
使用此配置,将记录来自com.foo.Bar
的所有日志事件,但只记录所有其他组件的错误事件。
在上一个示例中,来自com.foo.Bar
的所有事件仍会写入控制台。这是因为com.foo.Bar
的日志记录器没有配置任何appender,就像其父对象。其实,下面的配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.foo.Bar" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
将会输出结果:
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] TRACE com.foo.Bar - exit (false)
17:13:01.540 [main] TRACE com.foo.Bar - exit (false)
17:13:01.540 [main] ERROR MyApp - Didn't do it.
请注意,来自com.foo.Bar
的trace消息会出现两次。这是因为首先使用与记录器com.foo.Bar
相关联的appender,它将第一个实例写入控制台。接下来,引用com.foo.Bar
的父对象,在这种情况下是根记录器。然后将事件传递给它的appender,它也写入控制台,导致第二次写入。这称为叠加性。虽然叠加性可以是一个相当方便的功能(如第一个前面的例子,不需要配置appender引用),但在许多情况下,这种行为被认为是不受欢迎的,因此可以通过在记录器上设置additivity属性为false来禁用它:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.foo.Bar" level="trace" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
一旦事件到达一个记录器,并且其additivity设置为false,事件将不会被传递给它的任何父记录器,而不管它们的additivity设置。