【问题标题】:Log4j - priority value and param name concept explanationLog4j - 优先级值和参数名称概念解释
【发布时间】:2012-01-29 00:38:23
【问题描述】:

我的log4j.xml

 <appender name="B2BAPP" class="org.apache.log4j.RollingFileAppender">
     <param name="File" value="/LOGS/SAM/B2B_VJ.log"/>   
     <param name="Threshold" value="ERROR"/> 
     <param name="MaxFileSize" value="10000KB"/>
     <param name="MaxBackupIndex" value="10"/>
     <param name="Append" value="false"/>
     <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d{dd MMM yyyy HH:mm:ss,SSS} %5p [%c:%L] %m%n"/>
     </layout>      
</appender>

<logger name="com.sas">    
   <priority value="DEBUG"/>
   <appender-ref ref="B2BAPP"/>
</logger>

我想了解 priority value="DEBUG"param name="Threshold" value="DEBUG" 的行为。

在我的记录器 (com.sas) 中,我设置了优先级值“DEBUG”,该记录器的附加程序是“B2BAPP”,在“B2BAPP”中,我将“阈值”定义为“错误”。

那么“com.sas”的日志级别将设置为“DEBUG”还是“ERROR”?

案例:

priority value="DEBUG" 和 param name="Threshold" value="ERROR"

priority value="ERROR" 和 param name="Threshold" value="DEBUG"

上述情况的输出是什么?它是如何工作的?

【问题讨论】:

    标签: log4j logging


    【解决方案1】:

    Logger 组件接受日志记录指令(logger.debug()logger.error() 等调用)并将它们发送到适当的目的地到 Appenders。

    您可以在Logger 上设置“优先级”并指示它只接受特定级别的日志记录指令。级别为(按重要性升序排列):TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL。

    这样的配置:

    <logger name="com.sas">
        <priority value="WARN" />
        ....
    </logger>
    

    指示com.sas 记录器仅接受重要性级别为 WARN 或更高的级别(即 WARN、ERROR 和 FATAL)。

    然后将日志记录语句发送到Appenders。附加器也可以配置为只接受某个重要性级别的语句,一个高于某个“阈值”的语句。

    这样的配置:

    <appender name="B2BAPP" class="org.apache.log4j.RollingFileAppender">
       <param name="Threshold" value="ERROR"/> 
       ....
    </appender>
    

    告诉 appender 只接受 ERROR 或以上重要性的语句(即 ERROR 和 FATAL)。

    那么“com.sas”的日志级别会设置为“DEBUG”还是“ERROR”?

    在您的示例中,日志级别设置为调试。附加程序写入的内容与问题无关。

    至于你的两个例子:

    priority value="DEBUG" 和 param name="Threshold" value="ERROR"

    priority value="ERROR" 和 param name="Threshold" value="DEBUG"

    1. 记录器优先级设置为DEBUG,附加器阈值设置为错误意味着记录器传递DEBUG、信息、警告、错误和致命但附加器只接受错误和致命所以你只得到错误和 FATAL 进入您的日志。

    2. 记录器优先级设置为错误,附加程序阈值设置为调试意味着记录器仅传递错误和致命,而附加器接受调试、信息、警告、错误和致命。您的日志中再次只有 ERROR 和 FATAL。

    但这只是一个不幸的案例。混合优先级和阈值可以获得一些不错的功能。比如……

    ...假设您刚刚将一个应用程序置于暂存状态,并且您需要对其进行一段时间的监控,直到您将其移至生产环境。您有一名开发人员和一名系统管理员进行监控。虽然开发人员想要所有日志,但系统管理员很忙,只想查看错误。

    你如何配置它?像这样的东西怎么样:

    <appender name="developerLogs" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="/LOGS/SAM/developerLogs.log" />
        <param name="Threshold" value="DEBUG" />
        <param name="Append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n"/>
        </layout>
    </appender>
    
    <appender name="sysAdminLogs" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="/LOGS/SAM/sysAdminLogs.log" />
        <param name="Threshold" value="ERROR" />
        <param name="Append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m%n"/>
        </layout>
    </appender>
    
    <logger name="com.test">
        <priority value="DEBUG" />
        <appender-ref ref="developerLogs" />
        <appender-ref ref="sysAdminLogs" />
    </logger>
    

    如果你运行如下代码:

    Logger logger = Logger.getLogger("com.test");
    
    logger.debug("some debug statement");
    logger.info("some info statement");
    logger.warn("some warn statement");
    logger.error("some error statement");
    logger.fatal("some fatal statement");
    

    你可以在sysAdminLogs.log

    some error statement
    some fatal statement
    

    这个在developerLogs.log:

    some debug statement
    some info statement
    some warn statement
    some error statement
    some fatal statement
    

    希望这个解释能更好地描述这些概念。

    【讨论】:

      猜你喜欢
      • 2015-03-07
      • 2014-07-23
      • 2013-05-06
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      • 2014-11-25
      • 1970-01-01
      相关资源
      最近更新 更多