Ubuntu Java日志文件过大怎么清理
导读:Ubuntu Java日志过大清理与治理 一、先定位日志来源与大小 查看常见日志目录与大小: 系统日志:/var/log/(如 syslog、auth.log) Tomcat:/opt/tomcat/logs/(如 catalina.o...
Ubuntu Java日志过大清理与治理
一、先定位日志来源与大小
- 查看常见日志目录与大小:
- 系统日志:/var/log/(如 syslog、auth.log)
- Tomcat:/opt/tomcat/logs/(如 catalina.out、catalina..log、localhost.log)
- Spring Boot/JAR:/var/log/yourapp/ 或应用工作目录(如 app.log、nohup.out)
- 快速定位大文件(示例):
- 按大小列出前10个文件:
sudo du -ah /var/log /opt/tomcat/logs /var/log/yourapp 2> /dev/null | sort -rh | head -n 10 - 按时间查看最近修改:
sudo find /var/log /opt/tomcat/logs /var/log/yourapp -type f -name "*.log" -mtime -7 -ls
- 按大小列出前10个文件:
二、优先方案 Logrotate 自动轮转与压缩
- 适用场景:长期运行服务(如 Tomcat、Spring Boot JAR、Logback/Log4j2 输出到文件)。
- 创建配置(示例为按大小切割,不重启应用):
- 新建文件:
sudo vim /etc/logrotate.d/java-app - 写入内容(按需调整路径与保留份数):
/home/data-govern/data-govern-executor.log { size 1G rotate 100 compress missingok notifempty copytruncate } - 说明:
- size 1G:当文件超过 1GB 触发轮转。
- rotate 100:最多保留 100 个归档。
- compress:旧日志压缩为 .gz。
- copytruncate:复制后截断原文件,避免重启 Java 进程;适合无法发送 SIGHUP 的场景。
- 新建文件:
- 测试与生效:
- 语法/执行计划检查:
sudo logrotate -d /etc/logrotate.d/java-app - 强制执行一次:
sudo logrotate -f /etc/logrotate.d/java-app
- 语法/执行计划检查:
- 常见框架补充:
- Logback:使用 TimeBasedRollingPolicy(按天/按小时)与 SizeAndTimeBasedRollingPolicy(按大小+时间),自动生成 .gz 归档。
- Log4j2:使用 RollingFileAppender + TimeBasedTriggeringPolicy/SizeBasedTriggeringPolicy,设置 maxHistory 控制保留份数。
- 提示:若应用已自行按日期/大小切割(如按天生成 app.log.2025-11-18),logrotate 仍可用于压缩与过期清理(按 rotate 与 maxage 策略)。
三、无法轮转时的安全清理与切割
- 安全清空正在写入的日志(避免直接 rm 导致句柄占用与“文件空洞”):
- 方式A(推荐):清空而非删除
> /path/to/app.log或truncate -s 0 /path/to/app.log
- 方式B:先切分再清空
- 按大小切分:
split -b 200M -d -a 4 /path/to/app.log /path/to/archive/app.log. - 清空原文件:
> /path/to/app.log
- 按大小切分:
- 说明:直接
rm大文件后,若进程仍持有文件句柄,磁盘空间不会立即释放;清空/切分更安全。
- 方式A(推荐):清空而非删除
- 按时间批量清理旧日志(配合 cron 定时执行):
- 示例脚本(保留最近 7 天):
#!/usr/bin/env bash LOG_DIR="/var/log/yourapp" find "$LOG_DIR" -type f -name "*.log" -mtime +7 -delete - 加入定时任务(每天 03:00 执行):
0 3 * * * /path/to/clean_logs.sh
- 示例脚本(保留最近 7 天):
- 备份后再清理(可选):
- 先拷贝归档:
tar czf /backup/logs-$(date +%F).tgz /var/log/yourapp/*.log.2025* - 再删除过期文件:
find /var/log/yourapp -type f -name "*.log.2025*" -mtime +30 -delete
- 先拷贝归档:
四、按场景给出可直接使用的配置
- Spring Boot/JAR(nohup 输出到单一文件,不能重启)
- 建议优先在应用内用 Logback/Log4j2 做按大小/时间滚动;若暂时无法改动,用 logrotate 的 copytruncate:
/home/app/runner.log { size 1G rotate 100 compress missingok notifempty copytruncate }
- 建议优先在应用内用 Logback/Log4j2 做按大小/时间滚动;若暂时无法改动,用 logrotate 的 copytruncate:
- Tomcat(catalina.out 持续增长)
- 方案A:应用内将 catalina.out 改为按天滚动(如 Logback 配置 ConsoleAppender 写入按时间切割的文件),再用 logrotate 压缩与清理旧归档。
- 方案B:无法改代码时,用 logrotate 的 copytruncate 安全截断:
/opt/tomcat/logs/catalina.out { daily rotate 30 compress missingok notifempty copytruncate }
- 通用按时间清理(任何目录)
- 保留 7 天:
0 3 * * * find /var/log/yourapp -type f -name "*.log" -mtime +7 -delete - 保留 30 天:
0 2 * * * find /var/log/yourapp -type f -name "*.log" -mtime +30 -delete
- 保留 7 天:
五、验证与运维要点
- 验证 logrotate:
- 干跑:
sudo logrotate -d /etc/logrotate.d/java-app - 强制执行:
sudo logrotate -f /etc/logrotate.d/java-app - 观察是否生成 .gz 归档与是否按 rotate 限制保留份数。
- 干跑:
- 避免“文件空洞”与句柄问题:
- 清空大文件用
> file或truncate -s 0 file,不要直接rm正在写入的文件。 - 若通过脚本切割,确保切割后应用继续写入正确文件(避免写入已归档的旧文件)。
- 清空大文件用
- 监控与容量规划:
- 设置磁盘告警(如 80% 阈值)。
- 结合应用日志级别与保留策略,避免无限制增长。
- 安全建议:
- 清理前确认日志路径与作用,避免误删业务关键日志。
- 重要日志先备份再清理,保留可供审计的时间窗口。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu Java日志文件过大怎么清理
本文地址: https://pptw.com/jishu/749833.html
