每当请求到达时,我都会尝试将一些用户数据记录到日志文件 log4j
在玩!框架1.2.5。我需要有两个独立的日志文件,它们将由不同的方法和类使用。我希望将自定义日志文件格式设置为:
date with time - request running time and some string
第一个问题:您能给我看一个有用的教程或答案吗?因为到目前为止我所做的一切都是无用的。
第二个问题:如何配置log4j为每个级别进行日志记录,例如仅记录ERROR
消息在一个文件上,而仅打印 INFO
和WARN
其他文件上的消息。我的log4j.properties
文件如下。我知道消息的特权。但即使我定义了阈值,为什么 ERROR
, FATAL
或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
最佳答案
您可以使用 NDC(嵌套诊断上下文)或 MDC(映射诊断上下文)。下面是在 Controller 上调用 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 = %d{dd MMM yyyy HH:mm:ss,SSS} - [%X{processTime}] - %m
%d{dd MMM yyyy HH:mm:ss,SSS}
用于输出日期,%X{processTime}
用于获取 processTime
值存储在 MDC 中。
您可以在此处查看引用资料:
- Log4j 1.2 Manual
-
PatternLayout
JavaDoc - What is the difference between Log4j's NDC and MDC facilities?
更新
阈值属性代表接受的最低级别/优先级,而不是绝对级别/优先级。因此,您的 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>
这里也给您一个很好的引用:
关于playframework - Log4j 自定义配置以分隔每个级别的日志 - Playframework 1.2.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16402677/