为什么更改根记录器对其他记录器没有影响?

时间:2015-05-16 05:54:56

标签: logging log4j

以下是我在log4j.xml应用程序中使用的spring

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="PRIMARY" class="org.apache.log4j.rolling.RollingFileAppender">
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="/var/log/myappcontroller-%d{yyyy-MM-dd}.log"/>
        </rollingPolicy>
        <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %d %-5p %c - %m%n"/>
        </layout>
    </appender>


<logger name="com.myapp.usercontroller" additivity="false">
        <level value=“INFO"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="PRIMARY"/>
    </logger>


  <root>
        <priority value="INFO”/> //changing this to DEBUG
        <appender-ref ref="PRIMARY"/>
        <appender-ref ref="CONSOLE"/>
    </root>

两个问题:

1)当我更改priority value =DEBUG中的<root>时,我希望看到来自com.myapp.usercontroller的调试日志。但是我没有。为什么更改<root>值没有效果。

2)相反,我开始看到记录器(org.apache.http)

DEBUG org.apache.http.headers - http-outgoing-0 >> POST /token HTTP/1.1

为什么会这样?我还没有配置这个记录器。但更改<root>会对此记录器产生直接影响。

感谢您的解释

1 个答案:

答案 0 :(得分:3)

您对名为com.myapp.usercontroller的记录器的显式定义包含一个阈值级别参数,该参数覆盖了根记录器本来可以继承的值。当您将根记录器的优先级从INFO更改为DEBUG时,这将影响每个记录器,除了具有显式配置值的记录器。这就是为什么你看到来自org.apache.http.headers的DEBUG日志,而不是你的控制器。

请注意,log4j xml令人困惑,因为它对根记录器使用priority,但对于命名记录器使用level,即使它们都引用了记录阈值。