logrotate 日志轮转配置:常用参数、copytruncate 陷阱与实战排错

举报
云上小栈 发表于 2026/11/01 00:44:35 2026/11/01
【摘要】 logrotate 的定位与执行时机logrotate 由 cron 或 systemd timer 触发,默认每天执行一次。查看触发方式:systemctl status logrotate.timer cat /etc/cron.daily/logrotate主配置为 /etc/logrotate.conf,它通过 include /etc/logrotate.d 引入各应用配置。系统级...

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 原因,再核对新建文件的属主权限,能避开大部分线上事故。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。