2

每当请求到达Play时,我都会尝试将一些用户数据记录到日志文件log4j中!框架 1.2.5。我需要有 2 个单独的日志文件,它们将被不同的方法和类使用。我想将我的自定义日志文件格式化为:

date with time - 请求运行时间和一些字符串

第一个问题:你能给我看一个有用的教程或答案吗?因为到目前为止我所做的一切都是无用的。

第二个问题:如何配置 log4j 为每个级别记录,例如只ERROR在一个文件上记录消息,而只在另一个文件上打印INFOWARN消息。我的log4j.properties文件在下面。我知道消息的优势。但是即使我定义了阈值,为什么ERRORFATAL或者WARN消息也被写入信息文件?

log4j.rootLogger = ERROR, JUSTINFO, JUSTERROR
log4j.logger = INFO

log4j.appender.JUSTINFO = org.apache.log4j.RollingFileAppender
log4j.appender.JUSTINFO.layout = org.apache.log4j.PatternLayout
log4j.appender.JUSTINFO.layout.ConversionPattern = %d{dd/MM/yyyy HH:mm:ss} - [%X{processTime}] - %m%n
log4j.appender.JUSTINFO.File = log/info.log
log4j.appender.JUSTINFO.Threshold = INFO

log4j.appender.JUSTERROR = org.apache.log4j.RollingFileAppender
log4j.appender.JUSTERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.JUSTERROR.layout.ConversionPattern = %d{dd/MM/yyyy HH:mm:ss} - [%X{processTime}] - %m%n
log4j.appender.JUSTERROR.File =log/warn.log
log4j.appender.JUSTERROR.Threshold = ERROR
4

1 回答 1

3

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

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示例文件应如下所示(使用控制台附加程序):

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}用于获取processTime存储在 MDC 中的值。

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

  1. Log4j 1.2 手册
  2. PatternLayoutJavaDoc
  3. Log4j 的 NDC 和 MDC 设施有什么区别?

更新

阈值属性表示接受的最低级别/优先级,而不是绝对级别/优先级。因此,您的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. 为什么选择 XML 而不是 Log4J 配置的属性文件?
  2. 如何在 log4j.xml 中设置过滤器
于 2013-05-07T01:53:27.733 回答