Logback 日志按月归档并保留 180 天,超期自动清理的配置实践

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.xmllogback.xml 中的 <appender name="FILE"> 部分。

如果你觉得有用,欢迎点赞、收藏或分享给团队成员!也欢迎在评论区交流你的日志管理经验 😊

相关推荐
铁皮饭盒19 小时前
Rust版Bun1.4之前, 盘点Bun1.3新特性
前端·javascript·后端
恋猫de小郭19 小时前
如何让 AI 快速搭建一套生产 Agent ?全面理解 Agent 架构。
前端·人工智能·ai编程
Csvn19 小时前
Vite 构建缓存优化:二次构建从 15s 降到 2s 的实战方案
前端
晓得迷路了19 小时前
栗子前端技术周刊第 135 期 - Vite 8.1、Rspack 2.1、Babel 8.0...
前端·javascript·vite
你听得到1120 小时前
用户说 App 卡,但说不清在哪?我把 Flutter 监控 SDK 升级成了链路观测工作台
前端·flutter·性能优化
天渺工作室1 天前
实现一个adblock/adblock plus等浏览器广告拦截器检测插件
前端·javascript
阳光是sunny1 天前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
ZhengEnCi1 天前
Q04-Vite禁用CSS代码分割-解决生产环境样式加载顺序混乱问题
前端·vue.js·vite
九酒1 天前
AI Agent 开发踩坑记:口播功能非得用 APP 原生实现吗?
前端·人工智能·agent