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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/36457845/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 01:28:38  来源:igfitidea点击:

Using log4j.xml, log specific file or package at debug everything else at error

javalog4j

提问by ScrappyDev

I'd like to setup my log4j.xml file to log specific classes/packages at DEBUG level and the rest at ERROR level.

我想设置我的 log4j.xml 文件以在 DEBUG 级别记录特定的类/包,而在 ERROR 级别记录其余的类/包。

As you can see below I updated the logging level to info for gov.xxxx.app.batch.threadand gov.xxxx.app.batch.sms.DoWorkto info.

正如您在下面看到的,我将日志记录级别更新为 info forgov.xxxx.app.batch.threadgov.xxxx.app.batch.sms.DoWorkinfo。

However it looks like the thresholdtakes precedence (which makes sense). Is there a way to make it so that the class/package level config takes precedence over the threshold? Or another approach that would yield the desired result?

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

log4j.xml:

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>

回答by hoaz

If I understand your requirements correctly you want to log:

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

  1. everything to console
  2. errors to logFile + INFO logs from specific packages
  1. 一切都可以安慰
  2. 来自特定包的 logFile + INFO 日志的错误

If that is the case you need to do following:

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

  1. remove threshold (or make it INFO) on logFile appender
  2. remove <appender-ref ref="logFile"/>from root logger because root logger specifies "all" and you do not want that
  3. add to all loggers which you want to see in logFile
  1. 删除 logFile appender 上的阈值(或使其成为 INFO)
  2. <appender-ref ref="logFile"/>从根记录器中删除,因为根记录器指定“全部”而您不希望那样
  3. 添加到您想在 logFile 中看到的所有记录器