Java 触发SizeBasedTriggeringPolicy时Log4j文件模式不工作

Java 触发SizeBasedTriggeringPolicy时Log4j文件模式不工作,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我们的log4j2配置存在问题,我们几乎直接从第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="f

我们的log4j2配置存在问题,我们几乎直接从第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>

%d{yyyy-MM-dd HH:MM:ss}%p%m%n
如果我减少时间间隔以确保它基于时间滚动,则会在文件名中放入正确的当前时间。但是,如果我将间隔增加到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>

org.springframework.boot
:

当与基于时间的触发策略组合时,文件模式必须包含%i,否则目标文件将在每次滚动时被覆盖,因为基于大小的触发策略不会导致文件名中的时间戳值发生更改。在没有基于时间的触发策略的情况下使用时,基于大小的触发策略将导致时间戳值更改

每次TimeBasedTriggering策略触发滚动时,都会创建一个名称中带有新时间戳的文件。下次命中基于大小的触发策略时,它将使用最新文件中的时间戳,并仅更改%i部分


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

您的意思是,在较小的时间间隔内,文件时间戳不会更改?对于您的配置,基于时间的滚动应该每5000秒发生一次,此时日期和时间应该更改。另外,我建议尝试使用最新的log4j2版本。对这些Log4j组件进行了一些修复,这些修复本可以修复此问题。要使用最新的Log4j 2 JAR,只需删除spring boot starter log4j2并替换为Log4j依赖项。
<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>