Logback 日志按月归档并保留 180 天的配置实践
日期 :2025年12月2日
标签:Java, Logback, 日志管理, 运维优化
在 Java 项目中,使用 Logback 作为日志框架非常普遍。合理的日志配置不仅能帮助我们快速排查问题,还能有效控制磁盘空间使用。本文将详细介绍如何配置 Logback,实现以下两个目标:
- ✅ 按月创建日志目录 (例如
2025-12/) - ✅ 每天生成一个日志文件 (例如
app-2025-12-01.log) - ✅ 自动保留最近 180 天的日志,过期自动清理
一、原始问题:日志散乱 + 保留时间不足
很多开发者初始配置类似这样:
<fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
这会导致:
- 每天一个文件夹,目录结构冗余;
- 仅保留 30 天日志,无法满足审计或长期排查需求。
而我们的目标是更整洁、更持久、更自动化的日志管理。
二、解决方案:调整 fileNamePattern + 延长 maxHistory
✅ 核心配置如下:
<configuration>
<property name="LOG_PATH" value="./log" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/ry-service.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按月建目录,按天建文件 -->
<fileNamePattern>${LOG_PATH}/%d{yyyy-MM}/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>180</maxHistory>
<!-- 可选:应用启动时清理过期日志 -->
<!-- <cleanHistoryOnStart>true</cleanHistoryOnStart> -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 其他 logger 和 root 配置保持不变 -->
<root level="INFO">
<appender-ref ref="FILE" />
<!-- 如需控制台输出,可加 CONSOLE -->
</root>
</configuration>
三、效果展示
配置生效后,日志目录结构将变为:
./log/
├── 2025-10/
│ ├── app-2025-10-01.log
│ ├── app-2025-10-02.log
│ └── ...
├── 2025-11/
│ ├── app-2025-11-01.log
│ └── ...
└── 2025-12/
├── app-2025-12-01.log
└── app-2025-12-02.log
- 每月一个文件夹,结构清晰;
- 每天一个日志文件,便于定位;
- 超过 180 天的日志文件会被自动删除;
- 对应的空月份目录也会被 Logback 自动清理(Logback ≥ 1.1.8)。
四、关键参数说明
| 配置项 | 作用 |
|---|---|
%d{yyyy-MM} |
在 fileNamePattern 中用于创建按月命名的目录 |
%d{yyyy-MM-dd} |
用于生成按天命名的日志文件 |
maxHistory=180 |
保留最近 180 个归档文件(按天滚动 ⇒ 180 天) |
cleanHistoryOnStart=true |
(可选)应用启动时立即清理过期日志 |
💡 注意:
<file>节点指定的是当前正在写入的日志文件路径(如ry-service.log),而归档文件由fileNamePattern决定。
五、常见问题 FAQ
Q1:为什么目录能自动删除?
Logback 在删除所有过期日志文件后,会尝试删除其父目录(如果为空)。该功能从 Logback 1.1.8 版本起默认启用。
Q2:能否压缩旧日志?
可以!只需在 fileNamePattern 末尾加上 .gz 或 .zip,例如:
<fileNamePattern>${LOG_PATH}/%d{yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
Logback 会自动压缩归档日志,节省磁盘空间。
Q3:maxHistory 是按天还是按文件?
它是按归档文件数量 计算的。由于你按天滚动(每天一个文件),所以 maxHistory=180 ≈ 保留 180 天。
六、结语
通过合理配置 Logback 的 TimeBasedRollingPolicy,我们可以轻松实现:
- 整洁的日志目录结构
- 灵活的保留策略
- 自动化运维,无需手动清理
这对于生产环境的稳定性与可维护性至关重要。希望本文能帮助你构建更专业的日志系统!
📌 附:完整配置文件参考
可直接替换你的
logback-spring.xml或logback.xml中的<appender name="FILE">部分。
如果你觉得有用,欢迎点赞、收藏或分享给团队成员!也欢迎在评论区交流你的日志管理经验 😊