我正在使用 log4j 2.17.1。
Log4j 每天都会滚动文件,但有时会写入已经滚动的文件。在某些情况下,它会回溯几天。
示例:
app.log.2022-01-03
已被 2022 年 1 月 4 日的数据覆盖。app.log.2022-01-04
已被 2022 年 1 月 10 日的数据覆盖。app.log.2022-01-11
已被 2022 年 1 月 17 日的数据覆盖。我这里的配置有问题吗?我只想让它每天滚动。
<Configuration>
<Appenders>
<RollingFile name="A1" append="true" fileName="/var/log/app/app.log">
<PatternLayout
pattern="%d{yyyy-MM-dd hh:mm:ss} [%t] %-5p %c %x %m%n"/>
<FilePattern>/var/log/app/app.log.%d{yyyy-MM-dd}</FilePattern>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="A1"/>
</Root>
</Loggers>
</Configuration>
我相信我的问题是由多个 LoggerContext 尝试写入同一个 RollingFileAppender 引起的。
我按照Log4j Web应用程序使用中的步骤解决了这个问题:
https://logging.apache.org/log4j/2.x/manual/webapp.html
我将多个 Web 应用程序部署到单个 JBoss 实例。每个应用程序都有自己的 log4j jar 副本。我将 log4j jar 从战争中移出并放入 JBoss 模块中,以将它们放入服务器类加载器中。
然后我按照“记录分离”页面上的说明进行操作:
https://logging.apache.org/log4j/2.x/manual/logsep.html
我为 JBoss 配置了一个 LoggerContext:
将日志记录 jar 放在容器的类路径中,并将系统属性 log4j2.contextSelector 设置为 org.apache.logging.log4j.core.selector.BasicContextSelector。这将使用单个配置创建一个 LoggerContext,该配置将在所有应用程序之间共享。