如何配置logback实现日志按时间、大小及应用启动时自动滚动
logback 实现按时间/大小滚动+启动触发滚动的配置方案
问题描述
使用logback的RollingFileAppender时,原有配置已经实现按天滚动、单文件超过阈值滚动,但应用重启时不会生成新的日志文件,需要额外实现启动时触发日志滚动,同时满足:
- 不破坏原有日志自动归档和清理逻辑
- 不需要在文件名中加入额外的启动时间戳
- 适配新版
SizeAndTimeBasedRollingPolicy
可行解决方案
方案一:内置参数配置(推荐,无需自定义代码)
logback 1.3.0及以上、1.4.0及以上版本已经原生支持启动时滚动的配置,仅需要在原有配置基础上新增2个参数即可,完整配置如下:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 关闭追加模式,启动时不往旧的当前日志文件写入内容 --> <append>false</append> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> <!-- 开启启动时自动触发滚动 --> <rolloverOnStartup>true</rolloverOnStartup> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
该方案完全保留原有文件名规则、归档和自动清理逻辑,无需修改任何业务代码,仅需升级到对应版本logback即可使用。
方案二:自定义滚动策略(兼容低版本logback)
如果无法升级logback版本,可以通过自定义滚动策略类的方式实现,步骤如下:
- 编写自定义类继承
SizeAndTimeBasedRollingPolicy,重写启动方法主动触发滚动:
package com.yourcompany.utils; import ch.qos.logback.core.rolling.RolloverFailure; import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy; public class BootRollingSizeTimePolicy<E> extends SizeAndTimeBasedRollingPolicy<E> { @Override public void start() { super.start(); try { rollover(); } catch (RolloverFailure e) { addWarn("启动日志滚动失败,将沿用原有文件写入:" + e.getMessage()); } } }
- 修改logback配置中rollingPolicy的实现类为自定义类即可,其余配置保持不变:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <append>false</append> <!-- 替换为自定义的滚动策略类全限定名 --> <rollingPolicy class="com.yourcompany.utils.BootRollingSizeTimePolicy"> <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>60</maxHistory> <totalSizeCap>20GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
两种方案均不会在日志文件名中新增额外启动时间戳,原有归档清理逻辑完全不受影响。
内容的提问来源于stack exchange,提问作者HugoRune
相关产品推荐
相关产品推荐

