时间基础滚动策略除非有新日志,否则不会滚动

2022-09-03 12:33:04

这是我的配置:

<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>

根据此处找到的日志文档(http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy),文件将根据我的文件名模式每分钟滚动更新一次。%d{yyyy-MM-dd_HH-mm}

我观察了它是如何工作的,这是我的发现:

  • 它不会在很长一分钟内创建日志文件。
  • 它仅在新日志到达时创建前一分钟的日志文件。(例如,我有一个晚上11:53的日志,现在是晚上11:55,当它到达晚上11:54时,它不会立即为晚上11:53创建新的日志文件,但是当一个新日志稍后出现时,比如在晚上11:56,它现在创建晚上11:53的文件。

我是否错过了什么,我以为它会每分钟创建一个日志文件?


答案 1

在您链接的文档部分进一步向下滚动,您将找到以下内容:

由于各种技术原因,翻转不是时钟驱动的,而是取决于日志记录事件的到达。例如,在 2002 年 3 月 8 日,假设文件名模式设置为 yy-MM-dd(每日翻转),则午夜后第一个事件的到达将触发翻转。如果在午夜后 23 分 47 秒(例如)期间没有日志记录事件,则翻转实际上将在 3 月 9 日 00:23'47 AM 发生,而不是在 0:00 AM 发生。因此,根据事件的到达速率,可能会触发翻转,并出现一些延迟。但是,无论延迟如何,已知滚动更新算法都是正确的,从某种意义上说,在特定时间段内生成的所有日志记录事件都将输出到分隔该时间段的正确文件中。

简短版本:它不是时间触发的,而是日志记录事件触发的。无日志记录事件意味着没有滚动更新。在设置为每分钟滚动更新的配置中,这意味着没有日志记录事件到达的任何分钟都不会有文件。


答案 2

不需要输入<文件>属性。

如果你省略了这一点,你可以解决你的问题

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


推荐