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

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

相关推荐
SEO_juper3 小时前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
Metaphor6923 小时前
快速合并 Word 文档【Python 指南】
python·word
亿元程序员3 小时前
为什么现在 AI 这么发达了,还要坚持手搓教程?
前端
無a伟3 小时前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
长谷深风1114 小时前
Agent 跑了 30 分钟宕机,如何从断点继续?
java·大数据·人工智能·ai·大模型·memory·aiagent
慧都小妮子4 小时前
DevExpress Java 文档处理 API 免费 CTP:PDF、PowerPoint、条码与跨平台部署
java·pdf·powerpoint·devexpress·文档处理·条码生成
JAVA老架构AI智能化4 小时前
如何高质量分块
人工智能·python
泡海椒4 小时前
告别反射低效:JQuick-Java ASM动态调用链性能优化实战
java·python·性能优化
2601_956319884 小时前
用示例和练习,把量化规则先练清楚
人工智能·python
土司大王4 小时前
LeetCode 17 电话号码的字母组合:Java 回溯模板、多叉决策树与复杂度分析
java·leetcode·决策树