logrotate 管理第三方应用日志的关键是通过 copytruncate 接管固定日志路径,确保轮转后应用持续写入;需在 /etc/logrotate.d/ 下新建配置,指定 daily、rotate、compress、create、missingok、notifempty 和 copytruncate 等参数,并手动验证轮转效果。

直接用 logrotate 管理第三方应用日志,关键不是改应用,而是让 logrotate 接管它的日志路径,并确保轮转后应用能继续写入——尤其当应用不支持重打开日志文件时,copytruncate 是最常用也最稳妥的解法。
定位日志路径并确认写入方式
先明确第三方应用(如 MongoDB、Java 服务、自研脚本)把日志写在哪。常见位置有:
• /var/log/mongodb/mongod.log
• /opt/app/logs/app.log
• /home/user/app/nohup.out
运行 lsof -p $(pgrep -f "app_name") | grep log 或查看应用配置,确认它是否持续追加写入单个文件(而非自己做轮转)。如果它只写一个固定路径且不自动 reopen,就必须靠 logrotate 的 copytruncate 机制来安全清空。
在 /etc/logrotate.d/ 下新建专属配置
不要改主配置文件 /etc/logrotate.conf,统一在 /etc/logrotate.d/ 下建独立文件(如 /etc/logrotate.d/myapp),内容示例:
/opt/app/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
create 0644 appuser appgroup
}
重点说明:
• copytruncate:先复制当前日志为归档,再清空原文件(不中断写入,适合所有不支持 SIGHUP 的应用)
• create:确保清空后新日志权限正确,避免应用因权限拒绝写入
• missingok + notifempty:防止启动前日志不存在或为空时报错
• 多个日志文件可用通配符(*.log),logrotate 会逐个处理
验证配置并触发首次轮转
配置写完别急着等 cron,先手动测试:
- 检查语法:
logrotate -d /etc/logrotate.d/myapp(调试模式,只显示动作,不执行) - 强制执行一次:
logrotate -f /etc/logrotate.d/myapp,观察:
– 原日志是否被清空(ls -l /opt/app/logs/)
– 是否生成app.log.1或app.log.1.gz
– 应用进程是否仍在正常写日志(tail -f /opt/app/logs/app.log)
若应用日志停写,大概率是 create 权限没对,或属主不属于运行该应用的用户。
配合应用重启或信号通知(可选进阶)
部分服务(如 Nginx、Redis)支持收到 SIGHUP 后重新打开日志文件。此时可去掉 copytruncate,改用 postrotate 发送信号:
/var/log/nginx/*.log {
daily
rotate 14
...
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
但对大多数第三方二进制程序(如 MongoDB、JVM 应用),它们不响应 USR1,强行发信号可能无效果甚至出错——此时坚持用 copytruncate 更可靠。











