log4j RollingFileAppender在应用程序关闭之前不写入日志

时间:2014-10-31 13:51:34

标签: java logging log4j slf4j

我们通过slf4j-log4j12 1.7.7使用log4j 1.2.17和Java 8.我在Windows 7 Professional 64位上运行Eclipse 4.4.1中的应用程序。

我们的根log4j.properties文件如下所示:

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p (%c{1}) [%d] - %l: %m%n

在应用程序中,我们根据配置设置了滚动文件追加器:

EnhancedPatternLayout patternLayout = new EnhancedPatternLayout("%-5p (%c{1}) [%d] - %l: %m%n");
RollingFileAppender rollingFileAppender = new RollingFileAppender(patternLayout, logPath, true);
rollingFileAppender.setMaxBackupIndex(5);
rollingFileAppender.setMaxFileSize(5MB);
Logger.getRootLogger().addAppender(rollingFileAppender);

这很好用......当应用程序最终关闭时!在应用程序运行时,日志文件位于零字节,这不是很有帮助。

(在我们的应用程序版本中,我们使用直接log4j切换到使用slf4j-> log4j。我不记得在切换之前行为是否有所不同。)

更新:我已经追踪了实际作家的创作。 log4j创建一个FileOutputStream,然后将其包装在OutputStreamWriter中,然后将其包装在由appender调用的CountingQuietWriter中。 bufferedIO标志已关闭。我还通过编写日志消息来跟踪,它似乎正常写入CountingQuietWriter - > OutputStreamWriter - > FileOutputStream。但在关闭应用程序之前,日志文件中没有任何内容。

为什么应用程序不立即写入日志,或者至少在缓冲区满了之后经常写入日志?

2 个答案:

答案 0 :(得分:0)

您可以尝试这样做,强制appender在应用程序记录每行时写入:

rollingFileAppender.setImmediateFlush(true);
rollingFileAppender.setBufferedIO(false);

奇怪的是,这些值是默认值,但无论如何都可以尝试。

答案 1 :(得分:0)

根据我的经验,这很可能只是您的操作系统/文件系统/存储设备/等问题,或者您用来查看文件大小的应用程序,而不是检索/复制/更新文件元数据...而且数据可能是实际上在那里。例如,文件系统可能仅在释放写锁定后复制/报告元数据。

当您在应用程序运行时打开文件(只读)时,您是否看到了数据,尽管报告了文件大小?

相关问题