我为我的Java应用程序设置了一个标准的logrotate风格的Log4jlogging器。 为此,我有几个RollingFileAppender
(一个用于项目的每个“子单元”)输出到应用程序文件夹中的日志文件。 我已经设置了大小限制,然后滚动到100MB。 在Linux上,这个function完美,日志在达到100MB后翻转。
但是,在Windows上,日志文件只是保持增长,不会翻转。
我已经在这个Stackoverflow文章中看到,在同一个JVM(或多个JVM)上使用同一个日志文件的多个Java应用程序将导致Log4j失败翻转,因为多个进程有文件描述符打开该文件 – 但在我的情况下,不是一个问题,因为我在单个 JVM上使用单个 Java应用程序。
请注意日志文件不在任何其他进程中打开。
任何人都可以提供更多的洞察到什么可能会导致/build议一种解决方法?
根据CekiGülcü 的完整Log4j手册 :
在同一个JVM中运行多个appender可以登录到同一个文件吗?
答案是不。 出于性能和其他技术原因,log4j不会在appender之间执行任何同步。 在同一个 JVM中有多个appender记录到同一个文件中与在不同的 JVM中有多个appender记录到同一个文件中没有太大区别。
鉴于上述,一个解决方案是创建一个单一的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将没有多个文件描述符问题,并将所有来源的所有内容记录到一个日志文件中。