logrotate 是 Linux 系统中用于自动管理日志文件的工具。它可以按照指定的规则(如每天、每周、或文件大小)对日志文件进行轮转(重命名旧日志)、压缩、删除(保留指定份数),甚至可以在轮转后执行自定义脚本(如重启服务),从而避免日志文件无限增长耗尽磁盘空间。
为什么需要 logrotate?
logrotate 的工作原理
logrotate 通常由系统的定时任务(cron)每天自动运行一次。
当 cron 触发 logrotate 时,它会读取所有配置,对符合条件的日志文件执行轮转操作。
logrotate 的核心配置指令
一个典型的 logrotate 配置由多个“规则块”组成,每个规则块指定要处理的日志文件路径及参数。常用指令如下:
| 指令 | 说明 |
|---|
daily / weekly / monthly | 轮转周期(每天/每周/每月) |
rotate N | 保留最近 N 个轮转后的旧日志(超过则删除) |
compress | 对旧日志进行压缩(通常用 gzip) |
delaycompress | 延迟压缩(推迟到下一次轮转时才压缩上一次的旧日志,避免正在写入的日志被压缩) |
missingok | 如果日志文件不存在,忽略错误,继续执行 |
notifempty | 如果日志文件为空,则不进行轮转 |
create [权限] [用户] [组] | 轮转后创建新的空日志文件,并设置权限和属主 |
size 大小 | 当日志文件达到指定大小时触发轮转(如 size 100M),可与周期共存 |
postrotate / endscript | 在轮转后执行的 shell 命令块(常用于通知服务重新打开日志文件,如 kill -HUP $(cat /var/run/nginx.pid)) |
sharedscripts | 对于匹配多个日志的规则,所有日志轮转后只执行一次 postrotate 脚本(默认每个日志执行一次) |
dateext | 在轮转后的文件名末尾加上日期(如 messages-20250317)而非简单的数字序号 |
配置文件示例
1. 全局配置 /etc/logrotate.conf
# 每周轮转
weekly
# 保留最近 4 个旧日志
rotate 4
# 创建新文件时使用默认权限
create
# 启用压缩
compress
# 包含 /etc/logrotate.d 下的所有配置
include /etc/logrotate.d
2. 针对特定服务的配置(例如 nginx)
在 /etc/logrotate.d/nginx 中:
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 日志文件不存在也没关系
rotate 14# 保留 14 天
compress # 压缩旧日志
delaycompress # 延迟压缩(避免压缩当前正在写入的日志)
notifempty # 空文件不轮转
create 0640 nginx adm # 轮转后新建日志文件,权限 0640,属主 nginx:adm
sharedscripts # 所有日志处理完后执行一次 postrotate
postrotate
if [ -f /var/run/nginx.pid ]; then
kill-USR1`cat /var/run/nginx.pid`# 通知 nginx 重新打开日志文件
fi
endscript
}
如何使用 logrotate
1. 手动测试配置是否正确
logrotate -d /etc/logrotate.conf
-d(debug)模式会模拟执行,不会实际轮转,只输出将要进行的操作,用于检查配置语法和预期行为。
2. 强制立即执行轮转
logrotate -vf /etc/logrotate.conf
-v:显示详细过程
-f:强制执行,即使未到轮转周期也会触发
也可以只强制某个服务的配置:
logrotate -vf /etc/logrotate.d/nginx
3. 查看上次运行时间
logrotate 的状态文件通常位于 /var/lib/logrotate/logrotate.status,记录了每个日志文件上次轮转的时间。
常见问题
Q: 为什么我配置了 daily,但日志没有每天轮转?A: logrotate 依赖 cron 每天执行一次,检查是否满足轮转条件。如果系统时间被更改,或者状态文件记录的时间未到,就不会触发。可以手动用 -f 强制执行测试。
Q: 如何按大小轮转?A: 使用 size 指令,例如 size 100M。注意如果同时指定了周期(如 daily),则满足任一条件就会轮转。
Q: 轮转后服务无法写入新日志?A: 常见原因是 postrotate 脚本没有正确通知服务重新打开文件。确保脚本中使用的是 kill -HUP 或 kill -USR1 等信号,不同服务可能不同(如 rsyslog 用 kill -HUP,nginx 用 kill -USR1)。
Q: 能否压缩后保留更长时间?A: 可以,rotate 指定保留份数,结合 compress 即可。例如 rotate 30 保留 30 个旧日志,如果每天轮转,就是约 30 天的历史。
总结
logrotate 是系统自带的日志管理利器,通过简单的配置即可实现自动化轮转、压缩、清理。
配置文件结构清晰,支持灵活的参数组合。
大多数服务(如 rsyslog、httpd、nginx)在安装时就会在 /etc/logrotate.d/ 下生成默认配置,通常无需修改即可工作。
若需调整,直接编辑对应的配置文件,然后可用 logrotate -d 验证,再用 -f 测试效果。
相比于手动编写清理脚本,使用 logrotate 是更标准、更可靠的做法,推荐在生产环境中采用。