我的身旁是一扇亮了又暗的窗

0%

Log4j2可见性

可加性

也许希望从 com.foo.Bar 之外的所有内容中消除所有 TRACE 输出。
仅更改日志级别将无法完成任务。相反,解决方案是向配置添加新的记录器定义:

1
2
3
4
<Logger name="com.foo.Bar" level="TRACE"/>
<Root level="ERROR">
<AppenderRef ref="STDOUT">
</Root>

使用此配置,将记录来自 com.foo.Bar 的所有日志事件,而仅记录来自所有其他组件的错误事件。
在前面的示例中,来自 com.foo.Bar 的所有事件仍被写入控制台。
这是因为 com.foo.Bar 的记录器在其父记录器上没有配置任何附加程序。其实下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>

会导致

1
2
3
4
5
6
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 的跟踪消息出现了两次。
这是因为首先使用与记录器 com.foo.Bar 关联的附加程序,该附加程序将第一个实例写入控制台。
接下来,引用 com.foo.Bar 的父级(在本例中为 root 记录器)。
然后将该事件传递到其附加程序,该附加程序还将写入控制台,从而导致第二个实例。
这称为可加性。
尽管可加性是一个非常方便的功能(例如在前面的第一个示例中,无需配置任何附加引用),但在许多情况下,此行为被认为是不希望的,因此可以通过将记录器上的可加性属性设置为来禁用它假:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>

一旦事件的可加性设置为 false 到达记录器,则无论事件的可加性设置如何,该事件都不会传递给其任何父记录器。