关闭Web容器时,Log4j无法与DailyRollingFileAppender一起正常工作

时间:2015-10-16 09:00:31

标签: java logging

我有一个使用Tomcat和Log4j的webapp。我每天使用DailyRollingFileAppender滚动日志文件。

log4j.appender.A.File=/tmp/log/service.log
log4j.appender.A.layout=org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}|[%t]|[%C.%M()<%L>] {%m}%n

在2015-10-16 23:59:00说,log4j正在将日志写入service.log。当第二天到来时,log4j成功翻转文件。现在我有两个文件service.logservice.log.2015-10-16service.log.2015-10-16的最后修改时间为&#34; 2015-10-16 23:59:09&#34;。 log4j正在将日志写入新文件service.log。但是在fuser的帮助下,我可以看到java进程正在使用这两个文件。

说我重新启动tomcat说&#34; 2015-10-16 07:00:00&#34;,service.log.2015-10-16的最后修改时间变为&#34; 2015-10-17 07:00 :00&#34 ;. service.log.2015-10-16的内容成为&#34; 2015-10-17 00:00:00&#34;到&#34; 2015-10-17 07:00:00&#34;。即,我丢失了2015-10-16的日志。 service.log的内容是&#34; 2015-10-17 07:00:00&#34;。

之后的日志。

我使用-Dlog4j.configDebug打开了Log4j的调试模式,但我没有发现任何错误。

我认为导致此问题的原因可能是log4j无法正常关闭。 任何人都可以向我解释一下吗?

这是DailyRollingFileAppender.rollOver()

的摘录
// close current file, and rename it to datedFilename
this.closeFile();

File target  = new File(scheduledFilename);
if (target.exists()) {
  target.delete();
}
File file = new File(fileName);
boolean result = file.renameTo(target);
if(result) {
  LogLog.debug(fileName +" -> "+ scheduledFilename);
} else {
  LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"].");
}

0 个答案:

没有答案