2016-03-04 81 views
2

我为我的Java应用程序设置了一个标准的logrotate样式的Log4j记录器。为此,我有几个RollingFileAppender s(项目的每个“子单元”)输出到应用程序文件夹中的日志文件。我已经设置了大小限制,然后滚动到100MB。在Linux上,这可以完美工作,日志在达到100 MB后会翻转。Log4j RollingFileAppender在Linux上滚动,但在Windows上不滚动

但是,在Windows上,日志文件只是保持增长并且不会翻转。

我已阅读this Stackoverflow post在同一个JVM(或多个JVM)上使用同一个日志文件的多个Java应用程序将导致Log4j失败翻转,因为多个进程具有对该文件打开的文件描述符 - 但在我的情况下显然不是问题,因为我使用单个 Java应用程序单个 JVM。

请注意,日志文件未在任何其他进程中打开。

任何人都可以提供更多的洞察到什么可能会导致此/建议的解决方法?

+0

请问您可以发布您的相关log4j配置。 – SubOptimal

+0

我在运行时动态设置'RollingFileAppender's - 为了使日志文件路径相对于软件的安装路径,我需要这个。 – Pickle

回答

0

根据The Complete Log4j ManualCekiGülcü

可以在同一个JVM日志运行到同一文件的多个附加目的地?

答案是否定的。出于性能和其他技术原因,log4j不会在appender之间执行任何同步。在多个appender中有相同 JVM记录到同一个文件与多个appender在不同 JVMs登录到同一个文件没有多大区别。

鉴于上述情况,一种解决方案是创建一个单一的RollingFileAppender并将其连接到根记录器,即

// Set up the RollingFileAppender 
RollingFileAppender rollingAppender = new RollingFileAppender(); 
rollingAppender.setFile(logfileURL); 

... (set up your appender here) 

// Attach it to the root logger 
LogManager.getRootLogger().addAppender(rollingAppender); 

的Log4j现在有没有多的文件描述符的问题,并会记录一切从所有来源到单个日志文件。