📚 ​​Linux Logrotate 日志轮转详解​

Logrotate 是 Linux 系统中用于自动化管理日志文件的工具,通过轮转(重命名/压缩旧日志)、清理过期日志和创建新日志文件,防止日志无限增长导致磁盘空间耗尽。以下从核心原理、配置实战、生产案例到运维实践全面解析。


🔧 ​​一、核心机制与工作原理​

  1. ​触发方式​

    • ​定时任务驱动​​:默认由 /etc/cron.daily/logrotate 脚本每日触发,读取全局配置 /etc/logrotate.conf 和子配置 /etc/logrotate.d/*
    • ​手动触发​​:
      logrotate -f /etc/logrotate.d/nginx  # 强制轮转
      logrotate -d /etc/logrotate.d/nginx  # 调试模式(模拟执行)
      
  2. ​轮转核心流程​

    • ​重命名旧日志​​:如将 app.log 重命名为 app.log.1(若启用 dateext 则用日期后缀,如 app.log-20250803)。
    • ​创建新日志文件​​:默认使用 create 策略新建空日志文件,继承原权限(需应用程序支持重开日志)。
    • ​压缩与清理​​:压缩旧日志(如 app.log.1.gz),删除超期文件(按 rotate 保留数量控制)。
    • ​信号通知服务​​:通过 postrotate 脚本(如 kill -USR1)通知服务(如 Nginx)重新打开日志文件。
  3. ​关键技术原理​

    • ​inode 机制​​:重命名日志文件不改变 inode 号,应用程序通过原 inode 持续写入,直到收到信号重开文件。
    • ​低风险截断​​:对不支持信号重启的服务(如 Java 应用),使用 copytruncate 策略(先复制后清空原文件),但可能丢失少量日志。

⚙️ ​​二、配置文件详解​

Logrotate 配置分为全局配置(/etc/logrotate.conf)和应用子配置(/etc/logrotate.d/*)。子配置优先级更高,常用参数如下:

​配置指令​ ​作用​ ​示例值​
daily/weekly/monthly 轮转频率 daily
rotate N 保留历史日志数量 7(保留7份)
size 100M 按大小触发轮转(优先级高于时间) size 100M
compress 启用 gzip 压缩旧日志 compress
delaycompress 延迟一轮再压缩(与 compress 联用) delaycompress
missingok 日志不存在时不报错 missingok
notifempty 空日志文件不轮转 notifempty
create MODE OWNER GROUP 创建新日志文件的权限、所有者和组 create 640 nginx nginx
copytruncate 复制后截断原文件(替代 create,兼容性高但可能丢数据) copytruncate
dateext 使用日期后缀命名历史日志(默认数字递增) dateext
sharedscripts 多个日志共享同一个 postrotate 脚本(避免重复执行) sharedscripts
postrotate/endscript 轮转后执行的命令(如重启服务) 见下文案例

🛠️ ​​三、生产级配置示例​

  1. ​Nginx 日志轮转​

    /var/log/nginx/*.log {
        daily
        rotate 30
        compress
        delaycompress
        missingok
        notifempty
        dateext
        dateformat -%Y%m%d  # 日期格式:-20250803
        create 640 nginx adm
        sharedscripts
        postrotate
            # 向 Nginx 主进程发送 USR1 信号,重开日志文件
            kill -USR1 $(cat /run/nginx.pid)
        endscript
    }
    

    ​关键点​​:

    • 使用 create 确保数据完整性,需 Nginx 支持信号重启。
    • sharedscripts 避免多个日志文件重复触发脚本。
  2. ​高并发服务日志(如 MySQL)​

    /var/log/mysql/slow.log {
        size 1G  # 按大小轮转(避免突发流量撑爆磁盘)
        rotate 10
        compress
        nodelaycompress  # 立即压缩
        copytruncate     # 避免重启数据库
        missingok
    }
    

    ​场景适配​​:数据库服务重启成本高,copytruncate 更安全,但需容忍微量日志丢失风险。

  3. ​多日志文件统一管理​

    /var/log/app/*.log /var/log/app/*.debug {
        weekly
        rotate 4
        compress
        missingok
        sharedscripts
        postrotate
            systemctl restart app-service
        endscript
    }
    

    ​提示​​:通配符匹配多个日志,sharedscripts 确保所有日志轮转后仅执行一次重启命令。


🚀 ​​四、运维最佳实践​

  1. ​权限与安全​

    • 日志目录权限设为 640(用户可写,组可读,其他无权限)。
    • 敏感日志用 chattr +i 防止误删(需在轮转前 chattr -i)。
  2. ​监控与调试​

    • ​检查轮转状态​​:
      cat /var/lib/logrotate/status  # 记录各日志上次轮转时间
      
    • ​日志异常排查​​:
      • 未轮转:检查 cron 任务、文件大小是否达标、权限是否正确。
      • 轮转后服务异常:验证 postrotate 脚本是否生效(如 nginx -t 测试配置)。
  3. ​高级策略​

    • ​混合触发条件​​:同时配置 dailysize 100M,满足任一条件即触发轮转。
    • ​企业级扩展​​:
      • 使用 olddir /backup/logs 将历史日志存储到独立分区。
      • 对接 ELK 栈:轮转后通过脚本将日志发送到 Logstash 集中分析。

⚠️ ​​五、常见问题与解决​

​问题现象​ ​原因​ ​解决方案​
轮转后日志停止写入 未重启服务或 create 权限错误 检查 postrotate 脚本或改用 copytruncate
历史日志未压缩 compressdelaycompress 冲突 移除 delaycompress 或调整顺序
轮转后服务崩溃 postrotate 脚本命令错误 logrotate -d 调试脚本逻辑
磁盘空间仍不足 rotate 值过大或未启用压缩 减少保留份数,启用 compress

💎 ​​总结​

Logrotate 通过自动化轮转机制平衡了日志完整性、存储效率与运维便捷性:

  1. ​核心价值​​:避免磁盘爆满、加速日志检索、支持审计合规。

  2. ​配置铁律​​:高频日志用 daily + size 双触发;关键服务优先 create;海量日志必开 compress

  3. ​终极建议​​:生产环境配置后务必用 logrotate -d -f 模拟测试,并通过 tail -f 实时监控日志连续性。

注:本文内容综合自多个权威来源,更多参数细节可参考 Logrotate 官方文档 或 。

posted on 2025-08-04 10:11  LeeHang  阅读(349)  评论(0)    收藏  举报