【问题标题】:log4j level trace and debug didn't show any loglog4j 级别的跟踪和调试没有显示任何日志
【发布时间】:2015-09-11 22:55:10
【问题描述】:

在 log4j 中有最低级别的跟踪、调试、信息、警告、错误和致命。 我使用级别信息通过此代码记录我的 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 级别时,它应该显示其级别及更高级别的所有日志,就像它应该在信息级别执行的操作一样(显示从信息到致命的日志)。

  • 当级别更改为跟踪/调试而不是级别信息时,为什么它会什么也没有显示?

  • 难道真的没有其他方法可以将错误日志与其他日志分开吗?

【问题讨论】:

    标签: java spring logging web-applications log4j


    【解决方案1】:

    尝试使用加性设置为 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>
    

    【讨论】:

    • 成功了,所有错误日志都在error.log中。但是在 abclog 中不仅有来自包 com.myapp 和 com.myapp.controller 的信息日志。还有信息日志,例如抽象处理程序方法映射和来自 java 类的抽象 url 映射。有没有办法为 com.myapp 和 com.myapp.controller 创建单独的根日志?所以它不会显示java包日志@dams
    • 如果声明类别信息和错误,错误日志不会显示在错误日志中,而是abclog。因为级别信息低于错误,所以它将从其级别及更高级别写入所有日志。实际上你的第一个代码是正确的。但我只想从 abclog 中删除默认的 java 类包日志,显然这似乎是不可能的。
    • 是的,对不起,我犯了一个错误,如果你写了多个同名的类别,它们将被覆盖,然后日志只在 abclog 中
    猜你喜欢
    • 2023-03-25
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多