使用 log4j.xml,在调试错误时记录特定文件或包

问题描述 投票:0回答:2

我想设置我的 log4j.xml 文件以在调试级别记录特定的类/包,并在错误级别记录其余的类/包。

如下所示,我将

gov.xxxx.app.batch.thread
gov.xxxx.app.batch.sms.DoWork
的日志记录级别更新为信息。

但是看起来

threshold
优先(这是有道理的)。 有没有办法使类/包级别配置优先于阈值?或者另一种可以产生预期结果的方法?

log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

        <appender name="console" class="org.apache.log4j.ConsoleAppender">
                <param name="threshold" value="all"/>
                <layout class="org.apache.log4j.PatternLayout">
                        <param name="conversionPattern" value="%d  %p  %c %L - %m%n"/>
                </layout>
        </appender>

        <appender name="logFile" class="org.apache.log4j.DailyRollingFileAppender">
                <param name="file" value="${app.batchdriver.home}/logs/${app.batchdriver.log.name}"/>
                <param name="maxFileSize" value="5MB"/>
                <param name="maxBackupIndex" value="20"/>
                <param name="threshold" value="error"/>

                <layout class="org.apache.log4j.PatternLayout">
                        <param name="conversionPattern" value="%d  %p  %c %L - %m%n"/>
                </layout>
        </appender>

        <!-- Logger for Batch classes -->
        <logger name="gov.xxxx.app">
                <level value="error"/>
        </logger>

        <!-- Logger for Spring classes -->
        <logger name="org.springframework">
                <level value="error"/>
        </logger>

        <!-- Logger for Hibernate classes -->
        <logger name="org.hibernate">
                <level value="error"/>
        </logger>

        <!-- Logger for Apache classes -->
        <logger name="org.apache">
                <level value="error"/>
        </logger>

        <!-- Logger for Apache classes -->
        <logger name="net.sf">
                <level value="error"/>
        </logger>

        <!-- Logger for testing Performance -->
        <logger name="gov.xxxx.app.batch.thread">
                <level value="info"/>
        </logger>
        <logger name="gov.xxxx.app.batch.sms.DoWork">
                <level value="info"/>
        </logger>
        <root>
                <priority value ="all" />
                <appender-ref ref="console"/>
                <appender-ref ref="logFile"/>
        </root>

</log4j:configuration>
java log4j
2个回答
1
投票

如果我正确理解您的要求,您想要记录:

  1. 一切需要安慰
  2. 来自特定包的 logFile + INFO 日志的错误

如果是这种情况,您需要执行以下操作:

  1. 删除日志文件附加器上的阈值(或使其成为信息)
  2. 从根记录器中删除
    <appender-ref ref="logFile"/>
    ,因为根记录器指定“全部”,而您不希望这样
  3. 添加到您想在日志文件中看到的所有记录器

0
投票

您需要将 additivity=false 设置为您的包特定记录器以覆盖根阈值级别。

至少这适用于 log4j 版本 1 (V1)。还没有用 log4j2 测试过。

让我们看一下这个简化的示例(log4j 版本 1 XML 格式):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

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

    <logger name="my.specific.package">
        <level value="debug"/>
    </logger>

    <root>
        <priority value="error"/>
        <appender-ref ref="console"/>
    </root>
</log4j:configuration>

在这种情况下,“my.spec.package”的调试输出将无法通过,错误的根级别将应用于它们。

现在让我们将 additivity=false 设置为“my.spec.package”记录器:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

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

    <logger name="my.specific.package" additivity="false">
        <level value="debug"/>
        <appender-ref ref="console"/>
    </logger>

    <root>
        <priority value="error"/>
        <appender-ref ref="console"/>
    </root>
</log4j:configuration>

尽管根级别设置为错误,“my.spec.package”的调试输出仍将通过。

所有其他包,如 Hibernate 或 Spring,将在错误级别重要性级别进行过滤;只有您的包中的记录器才能以 DEBUG 级别通过。

您还需要将对附加程序的引用添加到您的记录器中:

<appender-ref ref="console"/>
否则 log4j 会抱怨从包中记录时没有配置任何附加程序。

我已经在这里回复了:仅指定某些包有调试输出

© www.soinside.com 2019 - 2024. All rights reserved.