gpt4 book ai didi

java - 触发 SizeBasedTriggeringPolicy 时 Log4j Filepattern 不起作用

转载 作者:行者123 更新时间:2023-12-02 08:43:50 26 4
gpt4 key购买 nike

我们的 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(截至目前)

这是一个错误还是预期的行为。作为一种预期行为没有多大意义,但如果是这样,我们应该做什么来解决这个问题?

最佳答案

这些策略似乎按照文档中所述起作用。我在 Spring Boot 2.2.6.RELEASE 应用程序上测试了它:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

然后我使用以下依赖项而不是启动器,以确保我使用的是最新版本:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jcl</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.13.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.13.2</version>
</dependency>

在这两种情况下,仅当没有使用 TimeBased 触发策略时,SizeBased 触发策略才会更改文件名中的时间戳。

来自documentation :

When combined with a time based triggering policy the file pattern must contain a %i otherwise the target file will be overwritten on every rollover as the SizeBased Triggering Policy will not cause the timestamp value in the file name to change. When used without a time based triggering policy the SizeBased Triggering Policy will cause the timestamp value to change.

每次 TimeBasedTriggering 策略触发翻转时,都会创建一个名称中包含新时间戳的文件。下次命中 SizeBased 触发策略时,它将使用最新文件中的时间戳并仅更改 %i 部分。

由于您无法更改 SizeBasedTriggerin 策略确定索引的方式,唯一明显的解决方案似乎是更改 cron 作业以不移动具有最新时间戳和索引的文件。这应该足以解决您的问题。

关于java - 触发 SizeBasedTriggeringPolicy 时 Log4j Filepattern 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61214180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com