1

我的对象是基于大小(10M)和时间(每天)的压缩(zip)归档,所以我这样编写配置:

<appender name="Behavior"  class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Encoding>UTF-8</Encoding>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize> 
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{50} - %msg%n
        </pattern>
   </layout>
</appender>

但我遇到了一个问题。例如今天是 8 月 10 日,所以 logback 正在写入日志文件“2013-08-10.0.log”。

但日志文件不会在 8 月 11 日 0:00:00 完成(意味着关闭并压缩到“2013-08-10.0.log.zip”)。事实上,直到 8 月 10 日之后的第一条记录写完,它才会最终确定。

这意味着,在 8 月 10 日之后,如果第一条记录是在 8 月 11 日 16:00:00 写入的,那么当我在 8 月 11 日 0:00 之间扫描目录时,我无法获得“2013-08-10.0.log.zip”: 00 和 16:00:00。我只能得到“2013-08-10.0.log”,我不能确定它是否完成。

一旦时间结束,我该如何完成日志文件?

4

1 回答 1

2

根据 logback-manual,翻转是在翻转时间之后的第一个日志事件上触发的,而不是时间本身:

“由于各种技术原因,翻转不是时钟驱动的,而是取决于日志事件的到来。例如,在 2002 年 3 月 8 日,假设 fileNamePattern 设置为 yyyy-MM-dd(每日翻转),则午夜之后的第一个事件将触发翻转。如果在午夜之后的 23 分 47 秒内没有记录事件,则翻转实际上将发生在 3 月 9 日凌晨 00:23'47,而不是凌晨 0:00。因此,根据事件的到达率,翻转可能会触发一些延迟。” ( http://logback.qos.ch/manual/appenders.html )

因此,没有仅配置的方法可以实现您的意图。如果这是一个很大的问题,您也许可以尝试在应用程序中实现代码,在午夜之后立即发送日志事件,以确保及时触发翻转。如果您无权访问主应用程序的代码,您可以实现一个简单的小应用程序,该应用程序只在每天午夜之后发送一个记录事件,并使用相同的附加程序。

于 2013-08-12T10:02:06.900 回答