我们在生产环境中面临一个问题,在某些情况下日志文件没有得到翻转。我们正在使用 Log4j 版本 1.2.17 以及 apache.commons-logging。创建自定义附加程序以滚动文件。appender 扩展了 Log4j 的 FileAppender。下面是 subAppend(LoggingEvent event) 方法的算法:
long n = System.currentTimeMillis();
// Has the time come to roll the log file?
if (n >= nextCheck)
{
now.setTime(n);
nextCheck = rc.getNextCheckMillis(now);
rollOver();
reachedMaxSize = false;
else
{
File f = new File(getFile());
// Has the log file has exceeded its maximum size?
if (!reachedMaxSize && f.length() > maxFileSize)
{
// Log file has reached it maximum size.
reachedMaxSize = true;
// Log one last message to the file stating the max has been reached.
LoggingEvent exeededEvent = new LoggingEvent(
getClass().getName(),
Logger.getLogger(getClass().getName()),
Priority.ERROR,
"Maximum log file size has been reached ("+maxFileSize/1024+"KB)",
null);
super.subAppend(exeededEvent);
}
// If the log has not reached its max size, write it. Otherwise,
// send log event to stdout.
if (!reachedMaxSize)
{
super.subAppend(event);
}
else
{
System.out.println(event.getRenderedMessage());
}
这是 Log4j.properties 文件
log4j.rootLogger=INFO,RCFLog
log4j.appender.RCFLog=com.ge.medit.util.logging.MaxFileSizeRollingFileAppender
log4j.appender.RCFLog.File=runtime/logs/rcf.log
log4j.appender.RCFLog.DatePattern=yyyyMMdd'_'{0}
log4j.appender.RCFLog.Encoding=UTF-8
log4j.appender.RCFLog.Append=true
log4j.appender.ConsoleLog=org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleLog.layout=org.apache.log4j.PatternLayout
log4j.appender.ConsoleLog.layout.ConversionPattern=%p [%t] %c{1}: %m%n
log4j.appender.RCFLog.layout=org.apache.log4j.PatternLayout
log4j.appender.RCFLog.layout.ConversionPattern=@%d{yyyyMMdd HH:mm:ss.SSS}@ %p {%t} %c{1}: %m%n
log4j.logger.GUIEVT=INFO
根据观察,系统上的日期发生了变化。日期设置为当前日期前 3 个月。
Current Date- 10th May 2018
nextCheck - 11th May 2018 00:00
Changed Date- 10th March 2018
No backup is created as a condition at line 3 failed.
5 月 11 日再次经过 12 小时后,日期更改为当前日期。到那时,文件的时间戳已更改为 3 月 10 日。由于没有 RollOver,下一次检查仍然是 2018 年 5 月 11 日 00:00。但是在 5 月 12 日 00:00,文件应该已经按照第 3 行的条件翻转,并且应该创建了一个新文件,但没有发生。此外,该文件已达到最大大小。从那时起,在系统重新启动之前没有日志。
Java 版本是java8u162。虽然我找不到任何说明它是否与 java 相关的帖子。
我试图在测试环境中重现相同的场景,但一切都按预期工作。
有没有人在使用 Log4j 时遇到过这样的问题?请分享您的意见。提前致谢。