基于时间的滚动策略在没有新日志时不会滚动。

16

这是我的配置:

<appender name="myAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <append>true</append>
    <file>mylogs.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>mylogs-%d{yyyy-MM-dd_HH-mm}.log</fileNamePattern>

        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} [%thread] - %M:%L - %msg%n</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>INFO</level>
    </filter>
</appender>
根据此处TimeBasedRollingPolicy所述,基于%d{yyyy-MM-dd_HH-mm}文件名模式,文件将每分钟滚动一次。
我观察到它的工作方式,并得出以下结论:
  • 它不会每分钟创建一个日志文件。
  • 只有在新日志到达时才为上一分钟创建一个日志文件。(例如,我在晚上11:53有一个日志,现在是晚上11:55,当它到达11:54时,它不会立即为11:53创建一个新的日志文件,但当稍后出现新的日志,比如在晚上11:56,它现在会为11:53创建文件。)
我错过了什么吗?我以为它会每分钟创建一个日志文件?
2个回答

24

在您提供的文档部分中往下滚动,您会发现以下内容:

由于各种技术原因,轮换不是由时钟触发,而是取决于日志事件的到达。例如,在2002年3月8日,假设fileNamePattern设置为yyyy-MM-dd(每天轮换),午夜后第一个事件的到来将触发轮换。如果在午夜后23分钟47秒内没有日志事件,则轮换实际上会在3月9日的00:23'47 AM发生,而不是在0:00 AM。因此,根据事件到达速率的不同,轮换可能会有一些延迟。但是,无论延迟多少,轮换算法都被认为是正确的,即在某段时间内生成的所有日志事件都将在正确的文件中输出。

简短版:它不是基于时间触发,而是基于日志事件触发。如果没有日志事件,就没有轮换。在设置为每分钟轮换的配置中,这意味着对于任何没有日志事件到达的分钟,都不会有文件。


这很有帮助。谢谢你。是否有一种方法/配置可以使其根据时间触发而不是日志事件触发? - lorraine batol
据我所知,无法配置logback创建空日志文件(这就是会发生的情况)。滚动始终发生在截止时间/大小后的下一个日志记录事件上。通过调度程序在每分钟开始时发送虚拟日志事件可能会实现解决方法,以强制创建新的日志文件而不需要真正的日志事件,但我不希望在我的应用程序中出现这种行为。你为什么要空的日志文件呢?如果几分钟内没有日志记录事件,我也不会期望有那段时间的日志文件。 - sheltem
不,我也不想要空的日志文件。我想要的行为是在午夜准确地创建当天的日志文件,而不是在新的日志文件到达时创建。 - lorraine batol
在logback中,只有在午夜准时到达事件时才能实现。如果非常重要,您可以尝试使用虚拟事件方法。 - sheltem

5

您不需要输入 <file> 属性。

如果省略它,您可以解决问题。

请注意 RollingFileAppender 中的 file 属性(TimeBasedRollingPolicy 的父级)可以设置或省略。通过设置包含 FileAppender 的 file 属性,您可以解耦活动日志文件的位置和归档日志文件的位置。当前日志将始终定向到由 file 属性指定的文件中。因此,当前活动日志文件的名称随时间不会更改。但是,如果选择省略 file 属性,则将根据 fileNamePattern 的值为每个周期重新计算活动文件。以下示例应该阐明这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接