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 分钟前
React中使用classnames的案例
前端·react.js·前端框架
Vic1010119 分钟前
Java正则表达式性能优化指南:编译开销、类加载与线程安全深度解析
java·性能优化·正则表达式
小陈phd20 分钟前
RAG从入门到精通(十四)——评估技术
人工智能·python
卡次卡次122 分钟前
注意点:多线程与多进程与在并行读-->并行cpu或者GPU处理--->并行写 的架构中,如何选择
linux·网络·python
一晌小贪欢23 分钟前
Python-12 Python生成器与yield:惰性求值的艺术
开发语言·python·python基础·python3·python小白·python生成器
小二·26 分钟前
Spring框架入门:代理模式详解
java·spring·代理模式
Rock_yzh26 分钟前
LeetCode算法刷题——53. 最大子数组和
java·数据结构·c++·算法·leetcode·职场和发展·动态规划
m***567227 分钟前
在Nginx上配置并开启WebDAV服务的完整指南
java·运维·nginx
蓝眸少年CY28 分钟前
Python科学计算 Numpy库
开发语言·python·numpy