我有一个使用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.log
和service.log.2015-10-16
。 service.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+"].");
}