Log4j自定义配置为每个级别分隔日志 - Playframework 1.2.5

时间:2013-05-06 16:08:53

标签: playframework log4j playframework-1.x

我正在尝试将一些用户数据记录到日志文件,只要请求到达播放中的log4j!框架1.2.5 。我需要有2个独立的日志文件,它将由不同的方法和类使用。我想将我的自定义日志文件格式化为:

  

日期与时间 - 请求运行时间和一些字符串

第一个问题:您能否向我展示一个有用的教程或答案?因为到目前为止我所做的一切都没用。

第二个问题:如何将log4j配置为针对每个级别进行日志记录,例如仅在一个文件上记录日志ERROR消息,而只打印INFO和{{1其他文件上的消息。我的WARN文件位于下方。我知道消息的优先性。但即使我定义了阈值,为什么log4j.propertiesERRORFATAL消息也写入信息文件?

WARN

1 个答案:

答案 0 :(得分:3)

您可以使用NDC(嵌套诊断上下文)或MDC(映射诊断上下文)。下面是调用控制器上的Logger的示例:

public static StopWatch sw = new StopWatch();

public static void request001() {
    sw.start(); // start timer
    // logic of processing the request
    ...
    sw.stop(); // stop timer
    // using MDC to put elapsed time in milisecond
    MDC.put("processTime", sw.getElapsedTime());
    Logger.info("this is request001"); 
}    

log4j.properties示例文件应该如下(使用控制台appender):

log4j.rootLogger = INFO, loggerName
log4j.appender.loggerName = org.apache.log4j.ConsoleAppender
log4j.appender.loggerName.layout = org.apache.log4j.PatternLayout
log4j.appender.loggerName.layout.ConversionPattern = %d{dd MMM yyyy HH:mm:ss,SSS} - [%X{processTime}] - %m

%d{dd MMM yyyy HH:mm:ss,SSS}用于输出日期,而%X{processTime}用于获取存储在MDC中的processTime值。

您可以在此处查看参考资料:

  1. Log4j 1.2 Manual
  2. PatternLayout JavaDoc
  3. What is the difference between Log4j's NDC and MDC facilities?

  4. 更新

    阈值属性表示接受的最小级别/优先级,而不是绝对级别/优先级。因此,您的JUSTINFO记录器应记录优先级从INFO或更高开始的记录器。

    如果要将日志消息与级别(绝对级别范围过滤器)完全匹配,我认为您应该考虑将log4j.properties替换为log4j.xml(使用xml进行配置)。我举个例子:

    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
       <!-- JUSTINFO logging -->
       <appender name="JUSTINFO" class="org.apache.log4j.FileAppender">
          <param name="File" value="./info.log" />
          <param name="Threshold" value="INFO" />
          <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%-5p %t - %m%n"/>
          </layout>
          <filter class="org.apache.log4j.varia.LevelRangeFilter">
             <param name="LevelMin" value="INFO" />
             <param name="LevelMax" value="INFO" />
           </filter>
        </appender>
    
        <!-- JUSTERROR logging -->
        <appender name="JUSTERROR" class="org.apache.log4j.FileAppender">
           <param name="File" value="./error.log" />
           <layout class="org.apache.log4j.PatternLayout">
              <param name="ConversionPattern" value="%-5p %t - %m%n"/>
           </layout>
           <filter class="org.apache.log4j.varia.LevelRangeFilter">
              <param name="LevelMin" value="ERROR" />
              <param name="LevelMax" value="ERROR" />
           </filter>
        </appender>
    
        <!-- define root logger priority to ERROR -->
        <root>
           <level value="ERROR"/>
           <appender-ref ref="JUSTINFO"/>
           <appender-ref ref="JUSTERROR"/>
        </root>
    </log4j:configuration>
    

    这里也是一个很好的参考资料:

    1. Why chose XML over properties files for Log4J configuration?
    2. How to set filter in the log4j.xml