Logback重复记录

Dmi*_*try 4 logback slf4j

我有一个logback配置问题.这是我的logback.xml:

<configuration>

<appender name="EMS" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>../logs/ems.log</file>
    <append>true</append>
    <encoder>
        <pattern>[%d{ISO8601}] {%t} [%p] %c - %m%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>../logs/ems.log.%i</fileNamePattern>
        <minIndex>1</minIndex>
        <maxIndex>99</maxIndex>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <maxFileSize>50MB</maxFileSize>
    </triggeringPolicy>
</appender>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
   <encoder>
     <pattern>[%d{ISO8601}] {%t} [%p] %c - %m%n</pattern>
   </encoder>
</appender>

<logger name="a.b.c" level="DEBUG">
  <appender-ref ref="EMS"/>
</logger>

<logger name="a.b.c.d.SomeServiceImpl" level="INFO">
    <appender-ref ref="EMS"/>
</logger>

<logger name="a.b.c.e.SomeFilter" level="INFO">
    <appender-ref ref="EMS"/>
</logger>

<root level="OFF">
    <appender-ref ref="EMS"/>
</root>

</configuration>
Run Code Online (Sandbox Code Playgroud)

问题是当我为根记录器设置以下行时:

<appender-ref ref="EMS"/>
Run Code Online (Sandbox Code Playgroud)

在ems.log文件中,每行重复:

[2013-12-31 13:16:59,217] {[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'} [DEBUG] a.b.c.f.CallerImpl - qweqweqwe
[2013-12-31 13:16:59,217] {[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'} [DEBUG] a.b.c.f.CallerImpl - qweqweqwe
Run Code Online (Sandbox Code Playgroud)

但是当我设置以下内容时:

<appender-ref ref="STDOUT"/>
Run Code Online (Sandbox Code Playgroud)

一切按预期工作:

[2013-12-31 13:16:59,217] {[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'} [DEBUG] a.b.c.f.CallerImpl - qweqweqwe
Run Code Online (Sandbox Code Playgroud)

我曾预计,只要根记录器具有"关闭"级别,就不应该出现问题......

有人可以帮忙吗?

Iva*_*tyk 5

我认为问题在于,尽管根级别具有"OFF"级别,但您可以使用以下命令将以"abc"开头的记录器的有效日志记录级别更改为DEBUG:

<logger name="a.b.c" level="DEBUG">
  <appender-ref ref="EMS"/>
</logger>
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多相关信息.

只有名称不以"abc"开头的记录器才会被打印.名称以"abc"开头的所有记录器都将具有级别DEBUG,"abcdSomeServiceImpl"和"abceSomeFilter"除外,它们将INFO作为其有效日志记录级别.

"OFF"日志记录级别将被忽略,并且不会用于过滤日志记录事件.相反,它将在"abc"记录器记录后第二次记录相同的日志消息.

要解决您的问题,我建议删除此:

<root level="OFF">
    <appender-ref ref="EMS"/>
</root>
Run Code Online (Sandbox Code Playgroud)

来自您的日志记录配置,因为它不会更改记录器的有效日志记录级别,但会将所有日志事件附加到log.file以获取"abc"记录器.