log4j 级跟踪和调试没有显示任何日志

log4j level trace and debug didn't show any log

在log4j中,trace最低分为debug、info、warn、error、fatal。 我使用级别信息通过此代码记录我的 Web 应用程序

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="abclog" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="/data/abc/abc.log"/>
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
    </appender>

    <logger name="com.myapp">
        <level value="info" />
        <appender-ref ref="abclog"/>
    </logger>

    <logger name="com.myapp.controller">
        <level value="info" />
        <appender-ref ref="abclog"/>
    </logger>
</log4j:configuration>

它会生成 abc.log 包含从级别信息到致命级别的日志。

然后我尝试将错误日志仅移动到另一个文件,error.log。

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="errorlog" class="org.apache.log4j.DailyRollingFileAppender">
                <param name="File" value="/data/abc/error.log"/>
                <param name="DatePattern" value="'.'yyyy-MM-dd"/>
                <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
                </layout>
        </appender>

        <appender name="abclog" class="org.apache.log4j.DailyRollingFileAppender">
                <param name="File" value="/data/abc/abc.log"/>
                <param name="DatePattern" value="'.'yyyy-MM-dd"/>
                <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
                </layout>
        </appender>

        <logger name="com.myapp">
            <level value="error" />
            <appender-ref ref="errorlog"/>
        </logger>

        <logger name="com.myapp.controller">
            <level value="error" />
            <appender-ref ref="errorlog"/>
        </logger>

        <logger name="com.myapp">
            <level value="info" />
            <appender-ref ref="abclog"/>
        </logger>

        <logger name="com.myapp.controller">
            <level value="info" />
            <appender-ref ref="abclog"/>
        </logger>

    </log4j:configuration>

但没有用,所有记录器仍在 abc.log。我发现记录器输出所有等于该级别的消息以及所有比它更高级别的消息,这就是日志仍在 abc.log.

中的原因

当我删除 abclog 和日志级别信息时,它起作用了。它会在 error.log.

上显示来自级别错误(如果有的话可能是致命错误)的记录器

但是为什么当我尝试降低日志信息以在没有级别信息或错误的情况下进行跟踪/调试时,它什么也没有出现,没有创建记录器。

当我设置最低的 log4j 级别时,它应该显示其级别及更高级别的所有日志,就像它在信息级别应该做的那样(显示从信息到致命的日志)。

尝试使用可加性设置为 false 的类别。我没有测试过,但是像下面这样的东西应该可以工作:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="errorlog" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="Threshold" value="ERROR"/> 
            <param name="File" value="/data/abc/error.log"/>
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
    </appender>

    <appender name="abclog" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="/data/abc/abc.log"/>
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
    </appender>

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <param name="Threshold" value="INFO"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
    </appender>

    <!-- all error from com.myapp to errorlog only --> 
    <category name="com.myapp" additivity="false">
        <priority value="error" />
        <appender-ref ref="errorlog"/>
    </category>

    <!-- all other log from com.myapp to abclog only --> 
    <category name="com.myapp" additivity="false">
        <priority value="info" />
        <appender-ref ref="abclog"/>
    </category>

    <root>     
    <!-- all other log to console --> 
        <appender-ref ref="console"/>
    </root>

</log4j:configuration>

如果你想把com.myappcom.myapp.controller分开,你可以声明更多的类别。但是你应该在 com.myapp.

之前声明 com.myapp.controller

更新:您可以尝试使用过滤器,也许这就是您所需要的,在那之后,我就不知道了:

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="errorlog" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="Threshold" value="ERROR"/> 
            <param name="File" value="/data/abc/error.log"/>
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
               <param name="levelMin" value="ERROR" />
              <param name="levelMax" value="FATAL" />
            </filter>
    </appender>

    <appender name="abclog" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="Threshold" value="INFO"/> 
            <param name="File" value="/data/abc/abc.log"/>
            <param name="DatePattern" value="'.'yyyy-MM-dd"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
                <filter class="org.apache.log4j.varia.LevelRangeFilter">
               <param name="levelMin" value="INFO" />
              <param name="levelMax" value="WARN" />
            </filter>
    </appender>

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out"/>
            <param name="Threshold" value="INFO"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{ISO8601}] [%-5p] [%t] {%F:%M:%L} - %m%n"/>
            </layout>
    </appender>

    <!-- all log from com.myapp to special log file --> 
    <category name="com.myapp" additivity="false">
        <appender-ref ref="errorlog"/>
        <appender-ref ref="abclog"/>
    </category>

    <root>     
        <appender-ref ref="console"/>
    </root>

</log4j:configuration>