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

lor*_*tol 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>
Run Code Online (Sandbox Code Playgroud)

根据此处找到的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的文件.)

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

she*_*tem 19

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

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

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


jak*_*ake 5

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

如果省略,可以解决问题

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