logrotate 日志轮转配置:常用参数、copytruncate 陷阱与实战排错
logrotate 的定位与执行时机
logrotate 由 cron 或 systemd timer 触发,默认每天执行一次。查看触发方式:
systemctl status logrotate.timer cat /etc/cron.daily/logrotate
主配置为 /etc/logrotate.conf,它通过 include /etc/logrotate.d 引入各应用配置。系统级参数写在主配置,应用级参数写在 /etc/logrotate.d/ 下单独文件,同名文件覆盖全局值。
手动触发一次并查看效果(调试期必用,跳过对生产时间的等待):
logrotate -d /etc/logrotate.d/nginx # 只演练,不实际执行 logrotate -vf /etc/logrotate.d/nginx # 强制执行并输出详情
一份可直接使用的配置
以 Nginx 访问日志为例:
/var/log/nginx/*.log {
daily
rotate 14
size 100M
missingok
notifempty
compress
delaycompress
dateext
dateformat -%Y%m%d
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}关键点:rotate 14 表示保留 14 份历史;size 100M 与 daily 同时存在时,满足任一条件即轮转,日志量大的服务建议以 size 为主。dateext 让归档文件带日期后缀,便于检索;不加此选项时后缀为 .1、.2 递增。sharedscripts 保证多个匹配文件只执行一次 postrotate。
坑一:copytruncate 导致日志丢行
应用不支持重开文件句柄时,常改用 copytruncate。它的做法是先把日志复制成归档,再 truncate 原文件。复制与截断之间存在时间窗口,这段时间内写入的日志会丢失。对高频写入服务,一天丢失几十到几百行很常见。
验证方法:对比轮转前后 wc -l 总数与归档文件行数之和。
解决办法分两类:
- 首选让应用支持信号重开句柄,如 Nginx 的
kill -USR1、rsyslog 的HUP,配合create使用,不做复制。 - 无法改应用时,改用日志采集侧方案:应用内嵌滚动(如 Logback 的
SizeAndTimeBasedRollingPolicy),或由 Filebeat 采集时按 inode 跟踪,减少对 copytruncate 的依赖。
坑二:create 权限写错,应用重启后无法写日志
使用 create 0640 root root 而应用以 www-data 运行,轮转后新文件属主变成 root,应用下次写日志报 Permission denied,日志从此断流,且应用本身未必报错。
正确做法是按应用运行用户指定属主属组,并先确认 uid/gid 存在:
id www-data ls -l /var/log/nginx/
配置改为 create 0640 www-data adm。若应用依赖已有文件句柄而非重开,则必须配合 copytruncate,此时 create 不生效,权限沿用原文件,风险点转移回上一节的丢行问题。
常用排错与验证命令
轮转后没生成归档,先看 dry-run 输出里的 skipped 原因,notifempty 会在文件为空时跳过。
logrotate -d /etc/logrotate.d/mylog 2>&1 | grep -i skip ls -l /var/lib/logrotate/status grep mylog /var/lib/logrotate/status
status 文件记录每个日志上次轮转时间。测试时用 -f 强制,或临时删掉对应条目,避免因「当天已轮转」被跳过而误判配置无效。
回滚前先备份配置,确认无误后再执行:
cp /etc/logrotate.d/mylog /etc/logrotate.d/mylog.bak logrotate -vf /etc/logrotate.d/mylog
小结
配置 logrotate 的核心是三件事:轮转条件(由 daily 与 size 决定)、保留份数(由 rotate 决定)、以及轮转后应用能否继续写日志(由信号重开或 copytruncate 加 create 权限决定)。上线前先跑 logrotate -d 检查 skipped 原因,再核对新建文件的属主权限,能避开大部分线上事故。
- 点赞
- 收藏
- 关注作者
评论(0)