除非有新日志,否则TimeBasedRollingPolicy不会滚动

时间:2014-03-05 04:58:12

标签: java logging logback rollingfileappender

这是我的配置:

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

根据此处找到的logback文档(http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy),文件将根据我的%d{yyyy-MM-dd_HH-mm} fileNamePattern每分钟翻转一次。

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

  • 它不会很快创建日志文件。
  • 仅在新日志到达时创建前一分钟的日志文件。 (例如,我在晚上11:53有一个日志,现在是晚上11点55分,它在下午11点54分点击它时不会立即创建一个新的日志文件,但是当一个新的日志出现时,请说明晚上11:56,它现在创建了晚上11:53的文件。)

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

2 个答案:

答案 0 :(得分:19)

在您链接的文档部分中进一步向下滚动,您会发现:

  

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

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

答案 1 :(得分:5)

您不需要输入&lt; file&gt;属性。

如果省略,可以解决问题

  

请注意RollingFileAppender中的文件属性(父级的   可以设置或省略TimeBasedRollingPolicy。通过设置   包含FileAppender的文件属性,你可以解耦   活动日志文件的位置以及存档日志的位置   文件。当前日志将始终以指定的文件为目标   由文件属性。它遵循当前活动的名称   日志文件不会随时间而改变。但是,如果您选择省略   文件属性,然后将为每个活动文件重新计算活动文件   period基于fileNamePattern的值。以下示例   应澄清这一点。