温馨提示×

Ubuntu Java日志清理策略

小樊
44
2025-12-25 16:51:39
栏目: 编程语言

Ubuntu Java日志清理策略

一 策略总览与优先级

  • 优先在应用内配置日志框架的按时间/按大小滚动与保留策略(如 Logback、Log4j2),让日志在产生端就可控、可自动删除旧文件。
  • 对无法改代码或无框架的场景,使用 logrotate 做系统级轮转与压缩,按天/按大小切割并保留有限份数。
  • 对系统级服务日志(如 journald)单独设置保留时间与最大体积,避免与业务日志互相挤占。
  • cron + find/truncate 做兜底清理与紧急截断,处理历史归档与“文件被占用导致空间不释放”的应急场景。
  • 全流程遵循“先诊断后清理、先截断再删除、先备份再压缩”的安全原则。

二 快速诊断与应急安全清理

  • 诊断占用
    • 查看分区使用:df -hT
    • 定位大目录:du -sh /var/*
    • 定位大文件:ls -lhS /var/log | head
  • 安全清理
    • 文件仍在写入(被进程占用)时,优先“截断”而非删除:
      • truncate -s 0 /path/app.log: > /path/app.log
      • 验证:df -h 观察空间是否释放
    • 文件已停止写入:可 gzip app.log 备份或直接 rm -f app.log
    • 系统日志(journald)不要直接删文件,使用 journalctl 收缩:
      • 查看占用:journalctl --disk-usage
      • 保留最近一周:sudo journalctl --vacuum-time=1w
      • 限制最大体积:sudo journalctl --vacuum-size=500M
  • 原则:不要直接 rm 正在被进程写入的日志;先截断或让日志轮转释放句柄,再清理历史归档。

三 推荐方案与配置示例

  • 应用内日志框架策略(首选)
    • Logback(按天滚动 + 按大小切分 + 保留天数)
      • 关键思路:使用 TimeBasedRollingPolicy 配合 SizeAndTimeBasedFNATPSizeBasedTriggeringPolicy,设置 maxHistory(保留天数)与 totalSizeCap(总大小上限)。
    • Log4j2(按天/按大小滚动 + 保留份数)
      • 关键思路:使用 RollingFileAppender + TimeBasedTriggeringPolicy(interval=1 天)+ SizeBasedTriggeringPolicy(如 100MB),并设置 DefaultRolloverStrategy max=20
    • 优点:在应用侧完成切割与清理,避免外部工具对正在写入文件的干扰,策略可随应用生命周期生效。
  • 系统级 logrotate(无法改代码或服务标准输出场景)
    • 示例(按天轮转,保留 20 份,压缩,空文件不轮转,轮转后重建文件):
      /opt/app/logs/app.log {
          daily
          rotate 20
          compress
          missingok
          notifempty
          create 644 app app
          copytruncate
      }
      
      • 说明:对正在写入的文件优先使用 copytruncate,避免重启应用;如应用支持信号重开日志(如 Tomcat 的 catalina.out),可用 postrotate 发送信号。
      • 测试与生效:sudo logrotate -d /etc/logrotate.d/app(干跑),sudo logrotate -f /etc/logrotate.d/app(强制生效)。
  • 兜底定时清理(cron + find/truncate)
    • 删除 30 天前的 .log 归档:
      0 0 * * * find /var/log -type f -name "*.log" -mtime +30 -delete
      
    • 将 7 天前的 .log 文件内容清空(保留文件与 inode,避免句柄问题):
      0 1 * * * find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;
      
    • 建议将脚本输出到日志以便审计:>> /var/log/log-clean.log 2>&1

四 不同场景的配置要点

  • Spring Boot(内置日志)
    • application.yml 中控制日志滚动与保留(如按天/按大小、最大历史天数),并确保使用 RollingFileAppender;避免仅输出到控制台导致无法轮转。
  • Tomcat(catalina.out 等)
    • 使用 copytruncate 的 logrotate 配置,或启用 logrotate 的 postrotatecatalina.sh 发送 USR1 信号触发日志重开,减少应用短暂停顿。
  • 仅输出到 nohup.out 的 Java 进程
    • 使用 logrotate 的 copytruncate 策略对该文件做按大小/按天轮转,避免重启进程;注意 logrotate 的 size 触发是“检查点触发”,一次切割可能产出较大的历史分片。

五 维护与避坑清单

  • 不要直接删除正在写入的日志文件;使用 truncatecopytruncate 释放空间。
  • 优先在应用内设置滚动与保留策略,减少对外部工具的依赖与进程影响。
  • 对系统日志(journald)使用 journalctl --vacuum-* 收缩,避免与业务日志争抢磁盘。
  • 定期审计与演练:用 logrotate -d 干跑验证配置;为清理脚本增加日志与告警;在变更窗口执行可能影响在线的操作。

0