logrotate 是 Linux 下自动管理日志轮转的核心工具,通过 /etc/logrotate.conf 和 /etc/logrotate.d/ 下配置文件实现按周期、数量、大小等规则压缩、归档、删除旧日志,并支持 postrotate 脚本通知服务重载。

logrotate 是 Linux 系统中管理日志轮转最常用、最可靠的工具,无需写脚本就能自动压缩、归档、删除旧日志。它通过配置文件定义规则,由 cron 定期触发(通常每天一次),适合 nginx、apache、syslog、自定义应用等各类日志管理。
一、logrotate 配置文件结构与核心参数
主配置一般位于 /etc/logrotate.conf,全局设置;具体服务的配置常放在 /etc/logrotate.d/ 下独立文件中(如 /etc/logrotate.d/nginx)。
关键指令说明:
- daily / weekly / monthly:轮转周期,选其一
- rotate N:保留 N 个归档日志(如 rotate 7 表示留最近 7 份)
- compress:启用 gzip 压缩(生成 .gz 文件)
- delaycompress:延迟压缩,即本次轮转不压缩,下次才压(确保正在写的日志不被误操作)
- missingok:日志文件不存在时不报错
- notifempty:空文件不轮转
- create mode owner group:轮转后新建日志文件,并设权限和属主(如 create 0644 www-data www-data)
- sharedscripts:多个日志块共用 postrotate 脚本(避免重复执行)
- postrotate / endscript:轮转完成后执行命令,常用于通知服务重载日志(如 systemctl kill --signal=USR1 --kill-who=main nginx)
二、实战:为自定义应用配置日志切割
假设你的程序日志路径是 /var/log/myapp/app.log,希望按天切、保留 30 天、自动压缩、切完重启服务:
创建配置文件:/etc/logrotate.d/myapp
/var/log/myapp/app.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 myapp myapp
sharedscripts
postrotate
if systemctl is-active --quiet myapp; then
systemctl kill --signal=USR1 myapp
fi
endscript
}
注意:
- USR1 是多数日志友好型服务(如 nginx、rsyslog)支持的“重新打开日志文件”信号;若你的服务不支持,改用 restart 或 reload(但可能中断服务)
- 确保 myapp 用户对 /var/log/myapp/ 有写权限
- 测试配置是否语法正确:logrotate -d /etc/logrotate.d/myapp(-d 表示 debug 模式,只模拟不执行)
三、手动触发与排障技巧
刚配好或调试时,可强制运行一次:
- logrotate -f /etc/logrotate.d/myapp(-f 强制执行)
- 查看实际执行过程:logrotate -v -f /etc/logrotate.d/myapp(-v 显示详细步骤)
- 检查 cron 是否正常运行:systemctl status cron 或 grep logrotate /var/log/syslog
- 常见问题:权限不足(logrotate 进程以 root 运行,但目标目录属主不对)、信号未响应(服务未监听 USR1)、路径写错或通配符不匹配
四、进阶:多文件匹配与条件判断
若日志带日期后缀(如 app.log.20240501),或需匹配多个文件:
- 用通配符:/var/log/myapp/*.log
- 指定 size 触发:size 100M(优先级高于时间周期)
- 结合时间与大小:daily 和 size 50M 同时存在时,任一满足即轮转
- 避免并发冲突:加 copytruncate(先拷贝再清空原文件),适用于无法重开日志句柄的老程序(但有少量丢失风险)










