【发布时间】:2020-04-14 17:59:22
【问题描述】:
我们的 log4j2 配置存在问题,我们几乎直接从 https://www.baeldung.com/java-logging-rolling-file-appenders 第 4.4 节获取:
<RollingFile name="roll-by-time-and-size"
fileName="target/log4j2/roll-by-time-and-size/app.log"
filePattern="target/log4j2/roll-by-time-and-size/app.%d{MM-dd-yyyy-HH-mm-ss.SSS}.%i.log.gz"
ignoreExceptions="false">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss} %p %m%n</Pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="5 KB" />
<TimeBasedTriggeringPolicy interval="5000000" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="." maxDepth="2">
<IfFileName glob="target/log4j2/roll-by-time-and-size/app.*.log.gz" />
<IfLastModified age="20d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
如果我减少间隔以确保它基于时间滚动,这会将正确的当前时间放在文件名中。但是,如果我将间隔增加到 5000 或其他任何值并让 SizeBasedTriggeringPolicy 受到打击,则时间戳始终是相同的,并且是文件末尾索引中唯一更改的内容。
这对我们来说是个问题,因为我们有一个 cron 作业将滚动的文件移动到远程挂载点。这意味着下一次 log4j 达到基于大小的触发策略时,索引将重置为 1,文件名中的时间戳将保持不变,即使它不应该是相同的(为什么??),我们的 cron 作业将尝试移动该文件,但它将与已移动的另一个文件的文件名相同。
使用最新的spring boot starter log4j2(截至目前)
是错误还是预期行为。作为一种预期的行为没有多大意义,但如果是这样,我们应该怎么做才能解决这个问题?
【问题讨论】:
-
您是说文件时间戳在较小的时间间隔内永远不会改变?使用您的配置,应每 5000 秒发生一次基于时间的翻转,此时日期和时间应更改。另外,我建议尝试使用最新的 Log4j 2 版本。对这些 Log4j 组件进行了一些修复,可以修复此问题。要使用最新的 Log4j 2 jar,只需删除 spring boot starter log4j2 并替换为 log4j 依赖项。