配置

叠加性

原文地址

也许希望去掉除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设置。

results matching ""

    No results matching ""