Logback rollingFileAppender xml 不滚动或删除旧的存档日志
Logback rollingFileAppender xml not rolling over or deleting old archived logs
这是 logback 的一部分:
<appender name="APP_LOG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${APP_HOME}/loader.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${APP_HOME}/archived/loader.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- Keep logs max for x days -->
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender>
这应该每天创建一个新的日志文件。今天是 Jan-13-2016,因此如果没有 Jan-12-2016 的日志,它应该将当前日志放入 loader.2016-01-12.0.log 然后创建一个新的日志文件,对吗?它不是那样做的。
它还应该删除文件 loader.2015-12-30.0.log 和 loader.2016-01-11.0.log 但它也没有这样做。
我所做的只是在基于 IDE 的 Eclipse 中启动应用程序,并且我可以验证日志文件 loader.log 是否在每次应用程序运行时发生变化。这意味着 logback 正在启动,但由于某种原因它没有正确清理旧文件。请帮忙?
TimeBasedRollingPolicy 的 Logback 文档指定 maxHistory
的单位是 个月,而不是天 (如果您的滚动模式是每月一次)。
关于为没有创建日志的日子创建一个空日志文件(大小为 0),我记得 log4j 没有创建它们。 log4j 中的 OOTB 日志轮换是 被动的 并且只有在新的一天将日志语句发送到 log4j 时才会触发。
我假设 Logback 的行为类似,但我正在检查,我会尽快更新这个答案。
编辑:确认。 TimeBasedRollingPolicy
不会为最后一个日志语句和当前日志语句之间的任何完全过去的中间日期创建 zero-sized 文件。
也就是说,如果您的上一个每日轮换日志语句是在 2015-01-01 并且您的下一个语句是在 2015-01-13,当处理后一条语句时,此时 Logback 仍会打开 2015-01-01 的文件。它会注意到并会触发翻转,它基本上包括:
但它不会创建任何中间 zero-byte 文件。
这是 logback 的一部分:
<appender name="APP_LOG"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${APP_HOME}/loader.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${APP_HOME}/archived/loader.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- Keep logs max for x days -->
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
</appender>
这应该每天创建一个新的日志文件。今天是 Jan-13-2016,因此如果没有 Jan-12-2016 的日志,它应该将当前日志放入 loader.2016-01-12.0.log 然后创建一个新的日志文件,对吗?它不是那样做的。
它还应该删除文件 loader.2015-12-30.0.log 和 loader.2016-01-11.0.log 但它也没有这样做。
我所做的只是在基于 IDE 的 Eclipse 中启动应用程序,并且我可以验证日志文件 loader.log 是否在每次应用程序运行时发生变化。这意味着 logback 正在启动,但由于某种原因它没有正确清理旧文件。请帮忙?
TimeBasedRollingPolicy 的 Logback 文档指定 maxHistory
的单位是 个月,而不是天 (如果您的滚动模式是每月一次)。
关于为没有创建日志的日子创建一个空日志文件(大小为 0),我记得 log4j 没有创建它们。 log4j 中的 OOTB 日志轮换是 被动的 并且只有在新的一天将日志语句发送到 log4j 时才会触发。
我假设 Logback 的行为类似,但我正在检查,我会尽快更新这个答案。
编辑:确认。 TimeBasedRollingPolicy
不会为最后一个日志语句和当前日志语句之间的任何完全过去的中间日期创建 zero-sized 文件。
也就是说,如果您的上一个每日轮换日志语句是在 2015-01-01 并且您的下一个语句是在 2015-01-13,当处理后一条语句时,此时 Logback 仍会打开 2015-01-01 的文件。它会注意到并会触发翻转,它基本上包括:
但它不会创建任何中间 zero-byte 文件。