
本文详解如何通过 Logback 配置实现按小时滚动生成归档日志文件(如 service.2024-05-20_14.log),确保每满一小时创建新文件、旧文件永久保留,不删除,并提供可直接运行的配置示例与关键注意事项。
本文详解如何通过 logback 配置实现按小时滚动生成归档日志文件(如 `service.2024-05-20_14.log`),确保每满一小时创建新文件、旧文件永久保留,不删除,并提供可直接运行的配置示例与关键注意事项。
Logback 默认的 TimeBasedRollingPolicy 仅支持基于日期(如 %d{yyyy-MM-dd})或带分钟精度(如 %d{yyyy-MM-dd_HH:mm})的归档,但单纯依赖 fileNamePattern 中的 HH:mm 并不能保证整点触发滚动——它仅在日志事件发生时检查时间是否跨段,且需配合正确的触发策略才能精准实现“每小时一个文件”。
要严格做到 每小时整点(例如 14:00、15:00)生成新归档文件,必须显式引入 CronTriggeringPolicy(需 Logback 1.3.0+),它基于 Quartz Cron 表达式主动触发滚动,不受日志写入频率影响。
以下是推荐的、经过验证的完整配置(兼容 Logback 1.4.x):
<configuration><property name="LOG_DIR" value="logs"></property><property name="ARCHIVE_DIR" value="${LOG_DIR}/archived"></property><appender name="FILE-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 主日志文件(当前活跃写入) --><file>${LOG_DIR}/campaign-service.log</file><rollingpolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 归档文件命名:精确到小时,格式如 archived/campaign-service.2024-05-20_14.log --><filenamepattern>${ARCHIVE_DIR}/campaign-service.%d{yyyy-MM-dd_HH}.log</filenamepattern><!-- 关键:启用 Cron 触发器,每小时整点触发(秒=0,分=0,时=*,日/月/年任意) --><triggeringpolicy class="ch.qos.logback.core.rolling.CronTriggeringPolicy"><schedule>0 0 0/1 * * ? *</schedule><evaluateonstartup>true</evaluateonstartup></triggeringpolicy><!-- 保留所有归档文件(不设上限) --><maxhistory>0</maxhistory><!-- 可选:禁用总大小限制,避免误删旧文件 --><!-- <totalSizeCap>0</totalSizeCap> --></rollingpolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 根日志器启用归档输出 --><root level="info"><appender-ref ref="FILE-ROLLING"></appender-ref></root><!-- 可选:业务包单独配置(如需更高日志级别) --><logger name="com.credence" level="trace" additivity="false"><appender-ref ref="FILE-ROLLING"></appender-ref></logger></configuration>
✅ 关键要点说明:
-
CronTriggeringPolicy的schedule="0 0 0/1 * * ? *"表示:每小时的第 0 分第 0 秒触发滚动(即整点)。 -
maxHistory=0表示无限保留归档文件,完全满足“no archived file should be deleted”要求。 -
fileNamePattern中使用%d{yyyy-MM-dd_HH}(下划线分隔)更符合常规命名习惯,避免因冒号(:)在部分文件系统中引发问题。 -
无需
SizeAndTimeBasedFNATP或totalSizeCap:题目明确只要求时间维度滚动,引入大小策略反而增加复杂度且非必需。
⚠️ 注意事项:
- 确保 Logback 版本 ≥ 1.3.0(推荐 1.4.14+),低版本不支持
CronTriggeringPolicy; - 若应用长期无日志输出,
evaluateOnStartup="true"可确保启动时检查并按需触发首次滚动; - Linux/macOS 下注意目录权限,确保进程有
logs/和logs/archived/的写入权限; - 测试时可将 cron 表达式临时改为
0 0/2 * * * ? *(每2分钟触发)快速验证逻辑。
通过以上配置,你的微服务将严格在每小时整点关闭当前日志文件,并立即创建下一个小时的归档文件(如 campaign-service.2024-05-20_14.log → campaign-service.2024-05-20_15.log),所有历史文件永久留存,满足生产级日志归档需求。










