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

Posted

技术标签:

【中文标题】Log4j 自定义配置为每个级别分隔日志 - Playframework 1.2.5【英文标题】:Log4j custom configuration to separate log for each level - Playframework 1.2.5 【发布时间】:2013-05-06 16:08:52 【问题描述】:

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

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

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

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

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 = %ddd/MM/yyyy HH:mm:ss - [%XprocessTime] - %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 = %ddd/MM/yyyy HH:mm:ss - [%XprocessTime] - %m%n
log4j.appender.JUSTERROR.File =log/warn.log
log4j.appender.JUSTERROR.Threshold = ERROR

【问题讨论】:

【参考方案1】:

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

log4j.rootLogger = INFO, loggerName
log4j.appender.loggerName = org.apache.log4j.ConsoleAppender
log4j.appender.loggerName.layout = org.apache.log4j.PatternLayout
log4j.appender.loggerName.layout.ConversionPattern = %ddd MMM yyyy HH:mm:ss,SSS - [%XprocessTime] - %m

%ddd MMM yyyy HH:mm:ss,SSS用于输出日期,%XprocessTime用于获取存储在MDC中的processTime值。

您可以在这里查看参考资料:

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

更新

Threshold 属性表示可接受的最低级别/优先级,而不是绝对级别/优先级。因此,您的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>

这里也给你一个很好的参考:

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

【讨论】:

感谢您的回答。有效。但它无法涵盖我的全部问题。我需要将信息消息写入日志文件以获取信息并将警告或任何错误消息写入另一个日志文件。我找到了一个自定义 appender 的例子,当我把它放在 log4j.properties 中时,我得到了 classNotFound 异常 请看我更新的答案。希望对你有用,朋友。 ;) 我在使用 log4j.xml 时收到此警告。我是否也应该为 JUSTINFO 使用新的 appender 和 root?log4j:WARN 持续解析错误 16 和列 12 log4j:WARN 元素类型“appender”的内容必须匹配“(errorHandler?,par am*,rollingPolicy?,triggeringPolicy? ,connectionSource?,layout?,filter*,appender-ref*)". 我已经更新了我的答案。我自己测试过。希望能让你更好的理解。祝你好运,朋友;) 啊。谢谢你,兄弟。你对我项目的日志记录过程太有用了:)再次感谢。

以上是关于Log4j 自定义配置为每个级别分隔日志 - Playframework 1.2.5的主要内容,如果未能解决你的问题,请参考以下文章

Java日志框架 -- LOG4J(Log4j入门案例日志级别Log4j组件(LoggersAppendersLayouts)配置文件内置日志记录自定义Logger)

Java日志框架 -- LOG4J(Log4j入门案例日志级别Log4j组件(LoggersAppendersLayouts)配置文件内置日志记录自定义Logger)

log4j输入日志都有哪些级别设置

log4j中输入日志都有哪些级别设置

自定义Log4j配置文件和RocketMQ-Client.jar下log文件冲突问题解决

关于log4j日志级别问题,懂的来