首页/系统/Linux 运维命令速查/logrotate 日志轮转配置

logrotate 日志轮转配置

logrotate 按计划切割、压缩、清理日志:daily/rotate/compress/maxsize 是核心参数,配置错误会导致日志不切或磁盘被日志吃满。

Linux 运维命令速查系统更新于 2026-10-13

logrotate 是什么

logrotate 负责把日志按计划切割、压缩、清理,默认由系统 cron 里的每日任务或 systemd timer 唤醒。它逐段读取配置,判断是否达到轮转条件,然后重命名旧文件、压缩存档、删除超期文件,必要时执行 postrotate 脚本通知服务重开日志。配置写错有两种典型后果:日志永远不切,磁盘被吃满;或者切了但服务还写旧文件,新建的日志一直是空的。

基本信息

适用平台Linux 全系,多数发行版默认预装
驱动方式系统 cron 的每日任务,或 logrotate.timer(systemd 系统)
配置位置主配置 /etc/logrotate.conf,应用片段放 /etc/logrotate.d/
常用指令daily/weekly/monthly、rotate N、size、maxsize、compress、delaycompress、copytruncate、missingok、notifempty、create、postrotate

典型使用场景

  • 新服务上线:为它的日志目录补一份 /etc/logrotate.d/ 片段
  • 磁盘被日志吃满:检查是没配轮转,还是 rotate 保留份数太大
  • 轮转后新日志为空:服务没重开文件句柄,需要在 postrotate 里 reload
  • 临时强制切一次:logrotate -f 立即执行,验证配置是否符合预期
  • 排查为什么没切:logrotate -d 干跑,逐行看它的判断依据

应用配置示例

应用配置示例
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 14
    maxsize 200M
    compress
    delaycompress
    missingok
    notifempty
    create 0640 appuser appgroup
    sharedscripts
    postrotate
        systemctl reload myapp >/dev/null 2>&1 || true
    endscript
}

调试与强制执行

调试与强制执行
logrotate -d /etc/logrotate.d/myapp      # 干跑:打印判断过程,不落盘
logrotate -f /etc/logrotate.d/myapp      # 立即强制轮转一次
logrotate -v /etc/logrotate.conf         # 详细模式,逐个片段看
cat /var/lib/logrotate/logrotate.status  # RHEL 系的状态文件,记录上次轮转时间

核心指令

指令作用使用提示
daily / weekly / monthly设定轮转周期与 size 同时写时,谁先满足就用谁
size 100M文件达到指定大小才轮转与周期并用可防止突发增长
maxsize 200M即使没到周期,超过该值也轮转流量突发的业务常用
rotate N保留 N 份旧日志要结合单份大小估算磁盘占用
compress / delaycompress压缩旧档 / 延后一轮再压delaycompress 与重载服务配合更安全
copytruncate复制后截断原文件服务不支持重开时用,有丢日志窗口
create 0640 用户 组轮转后新建文件并设定权限与属主与 copytruncate 不要同时使用
postrotate ... endscript轮转后执行的动作常用来让服务重开文件句柄
日志切了但新文件一直空着,是服务仍握着旧文件句柄的典型症状;解法是在 postrotate 里 reload 服务,或让应用支持收到指定信号后重开日志。
使用 copytruncate 时,从复制完成到截断之间存在一个窗口,这段时间新写入的日志会丢失;能重开文件的服务优先用 create 加 postrotate。

确认它到底跑没跑

确认它到底跑没跑
grep logrotate /var/log/cron            # RHEL 系从守护日志看执行记录
journalctl -u logrotate --since today   # systemd timer 驱动时看单元日志
ls -l /var/log/myapp/                   # 直接看目录里的文件与时间戳
配置里写通配符时,logrotate 会把当前匹配到的所有文件当作一组处理;加上 sharedscripts,postrotate 只执行一次,而不是每个文件都跑一遍。
missingok 与 notifempty 属于防御性指令:前者让文件不存在时不报错,后者让文件为空时跳过轮转。两个都写上,配置在异常情况下才不会频繁刷错误。
rotate 的数字直接决定磁盘占用上限:保留 14 份、单份最大 200M,最坏情况接近 3GB。容量紧张的机器要按这个乘积估算,而不是只看单份大小。
主配置 /etc/logrotate.conf 里的全局指令会被各片段继承,例如默认的 rotate、compress、create;片段里再写一遍即可覆盖。行为不符合预期时,先看全局段再怀疑片段。
日志轮转不等于备份:rotate 只保留最近若干份,超期即被删除。有合规留存要求的日志,需要在轮转之外单独归档到对象存储或备份系统。
验证配置是否真正生效,可靠做法是强制执行一次轮转,然后检查生成的文件名、属主与权限,再确认服务被正确通知;干跑模式只检查语法与命中的文件,不会执行轮转后的动作,用它验证重载逻辑会得到错误结论。轮转后文件的属主与权限取决于配置,收得比原文件更松会让日志被意外读取。

易错点

  • copytruncate 与 create 混用会写乱文件:前者保留原 inode,后者新建文件,二者只能选一
  • logrotate -d 干跑不会执行 postrotate,别用它验证重载逻辑是否真正生效
  • notifempty 遇到空日志会跳过轮转,长期为空的日志容易让人误以为配置没生效
  • 只写 rotate 份数不估算单份大小,即使压缩后仍可能把分区撑满
  • 报配置语法错误时先看 /etc/logrotate.d/ 下有没有编辑留下的中间文件,问题常出在那里
  • 轮转后不确认服务是否重新打开日志文件:进程仍持有已改名的旧文件句柄,新写的内容继续进入旧文件,磁盘占用不降反升,现象上像轮转完全没生效

数据来源与参考

  • man 8 logrotate
  • man 5 logrotate.conf

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌