在 CentOS 上压缩 Java 日志,常见做法有 手动压缩、定时任务(cron)、logrotate 自动管理 三种。下面按实用程度给你一个完整方案。
适合临时清理或一次性操作。
gzip 压缩cd /path/to/java/logs
gzip app.log
压缩后生成:
app.log.gz
✅ 推荐:
tar.gz 打包多个日志tar -czvf java-logs-$(date +%F).tar.gz *.log
CentOS 自带 logrotate,最适合 Java 日志管理。
vim /etc/logrotate.d/java-app
/path/to/java/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
daily |
每天轮转 |
rotate 7 |
保留 7 份 |
compress |
使用 gzip 压缩 |
delaycompress |
延迟一天压缩(防止 Java 占用) |
missingok |
日志不存在不报错 |
notifempty |
空文件不轮转 |
copytruncate |
复制后清空(适合 Java 不重开文件) |
✅ Java 项目强烈推荐 copytruncate
logrotate -vf /etc/logrotate.d/java-app
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
✅ 自动压缩 + 自动删除旧日志
<RollingFile name="File" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}.log.gz">
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="7"/>
</RollingFile>
crontab -e
0 2 * * * find /path/to/java/logs -name "*.log" -mtime +7 -exec gzip {} \;
或删除:
0 2 * * * find /path/to/java/logs -name "*.log.gz" -mtime +30 -delete
✅ 原因:Java 仍占用旧文件句柄
✅ 解决:
copytruncate✅ 可以,但 不建议直接 gzip ✅ 正确方式:logrotate / 日志框架
| 场景 | 推荐方式 |
|---|---|
| 生产环境 | ✅ logrotate |
| Spring Boot | ✅ Logback 自动压缩 |
| 临时处理 | gzip |
| 多服务 | tar.gz |
如果你愿意,可以告诉我:
我可以帮你写一份 完全适配你环境的配置。