使用 logback RollingFileAppender 时旧日志文件没有被删除
The old log files didn't get removed when using logback RollingFileAppender
我的logback.xml文件如下,我设置MaxHistory=1是为了删除旧的日志文件,只保留一天。但我发现旧文件没有被删除。我仍然可以将它们视为:app.log.2019-02-11 app.log.2019-02-12
<configuration>
<property name="APP_NAME" value="logbacktest-logs" />
<property name="LOG_HOME" value="/tmp/${APP_NAME}" />
<property name="ENCODER_PATTERN" value="%d %C.%method:%L _ %msg%n"/>
<contextName>${APP_NAME}</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<appender name="APP_APPEND" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app.log.%d{yyyy-MM-dd}</fileNamePattern>
<MaxHistory>1</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="APP_APPEND" />
</root>
</configuration>
这是我日志的一部分
12:11:32,358 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
这意味着如果您的应用程序在那段时间没有启动,那么它就没有机会删除它
当我将 maxHistory 设置为 5 时,我遇到了同样的问题,它有时会删除 5 个日志文件,但是当我的应用程序死机时,它无法删除日志,因为它没有机会删除。
参考 logback 文档,它说你可以使用这个:
<cleanHistoryOnStart> true </cleanHistoryOnStart>
如果设置为 true,归档删除将在 appender 启动时执行。默认情况下,此 属性 设置为 false。
存档删除通常在翻转期间执行。但是,某些应用程序可能无法存活足够长的时间来触发翻转。因此,对于此类短暂的应用程序,存档删除可能永远没有机会执行。通过将 cleanHistoryOnStart 设置为 true,归档删除在 appender 启动时执行。
将你的那段logback-spring.xml修改为:
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
我的logback.xml文件如下,我设置MaxHistory=1是为了删除旧的日志文件,只保留一天。但我发现旧文件没有被删除。我仍然可以将它们视为:app.log.2019-02-11 app.log.2019-02-12
<configuration>
<property name="APP_NAME" value="logbacktest-logs" />
<property name="LOG_HOME" value="/tmp/${APP_NAME}" />
<property name="ENCODER_PATTERN" value="%d %C.%method:%L _ %msg%n"/>
<contextName>${APP_NAME}</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<appender name="APP_APPEND" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app.log.%d{yyyy-MM-dd}</fileNamePattern>
<MaxHistory>1</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${ENCODER_PATTERN}</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="APP_APPEND" />
</root>
</configuration>
这是我日志的一部分
12:11:32,358 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
这意味着如果您的应用程序在那段时间没有启动,那么它就没有机会删除它
当我将 maxHistory 设置为 5 时,我遇到了同样的问题,它有时会删除 5 个日志文件,但是当我的应用程序死机时,它无法删除日志,因为它没有机会删除。
参考 logback 文档,它说你可以使用这个:
<cleanHistoryOnStart> true </cleanHistoryOnStart>
如果设置为 true,归档删除将在 appender 启动时执行。默认情况下,此 属性 设置为 false。
存档删除通常在翻转期间执行。但是,某些应用程序可能无法存活足够长的时间来触发翻转。因此,对于此类短暂的应用程序,存档删除可能永远没有机会执行。通过将 cleanHistoryOnStart 设置为 true,归档删除在 appender 启动时执行。
将你的那段logback-spring.xml修改为:
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/app.log.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>