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"> 部分。

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

相关推荐
BestAns4 小时前
一文带你吃透 Java 反射机制
java·后端
wasp5204 小时前
AgentScope Java 核心架构深度解析
java·开发语言·人工智能·架构·agentscope
WHOVENLY4 小时前
【javaScript】- 笔试题合集(长期更新,建议收藏,目前已更新至31题)
开发语言·前端·javascript
2501_916766544 小时前
【Springboot】数据层开发-数据源自动管理
java·spring boot·后端
free-elcmacom4 小时前
深度学习<4>高效模型架构与优化器的“效率革命”
人工智能·python·深度学习·机器学习·架构
指尖跳动的光4 小时前
将多次提交合并成一次提交
前端·javascript
程序员码歌5 小时前
短思考第263天,每天复盘10分钟,胜过盲目努力一整年
android·前端·后端
自在极意功。5 小时前
MyBatis 动态 SQL 详解:从基础到进阶实战
java·数据库·mybatis·动态sql
oden5 小时前
1 小时速通!手把手教你从零搭建 Astro 博客并上线
前端
若梦plus5 小时前
JS之类型化数组
前端·javascript