Linux logrotate命令(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

日志管理的重要性与logrotate的作用

在Linux系统运维和应用程序开发中,日志文件是系统运行状态的"黑匣子"。无论是排查故障、分析用户行为,还是优化系统性能,日志文件都扮演着关键角色。然而,随着系统运行时间的增长,日志文件会不断累积,最终可能导致存储空间告急、查询效率下降甚至系统崩溃。

此时,Linux logrotate命令就像一位智能的日志管家,通过预设的策略自动完成以下工作:

  • 轮转(Rotation):将旧日志文件重命名并归档
  • 压缩(Compression):减少历史日志占用的存储空间
  • 清理(Purge):删除超过保留期限的日志
  • 通知(Postprocessing):触发自定义脚本执行额外操作

通过合理配置logrotate,开发者和运维人员可以彻底告别手动管理日志的繁琐工作,让系统保持高效稳定运行。


logrotate的核心工作原理

想象logrotate是一个"日志整理机器人",它的运作流程可以拆解为以下步骤:

  1. 配置文件解析
    读取预定义的配置规则(如/etc/logrotate.conf/etc/logrotate.d/目录下的文件),确定需要处理的日志文件及操作策略

  2. 日志状态检查
    根据日志文件的大小、修改时间或预设的触发条件(如每天/每周执行),判断是否需要执行轮转操作

  3. 执行轮转操作

    • 将当前日志文件重命名为包含时间戳或序列号的归档名(如access.log-20230801
    • 可选地对归档文件进行压缩(gzip/bzip2等格式)
    • 清空原始日志文件或创建新的空日志文件
  4. 执行后续操作
    根据配置触发自定义脚本,例如通知管理员或重启服务以重新加载日志文件

这个过程完全自动化,开发者只需在配置文件中定义规则,logrotate便会按照设定周期自主执行。


logrotate配置文件详解

logrotate的配置主要通过两部分内容实现:

  • 主配置文件/etc/logrotate.conf(全局设置)
  • 服务配置文件/etc/logrotate.d/目录下的独立配置文件(如nginx、apache等服务的专属配置)

典型主配置文件示例

weekly  
rotate 4  
compress  
delaycompress  
missingok  
notifempty  
create 0640 root adm  
include /etc/logrotate.d  

关键全局配置项说明

配置项功能描述
weekly设置默认轮转周期为每周一次
rotate 4保留4个归档日志文件(包含当前日志)
compress启用归档日志的压缩功能
delaycompress延迟压缩,确保跨周期压缩(如月度压缩需配合monthly使用)
missingok若原始日志不存在时不报错
notifempty若日志文件为空则跳过轮转
create 0640 root adm轮转后重新创建日志文件,指定权限、所有者和所属组

服务专属配置文件示例(以nginx为例)

/var/log/nginx/*.log {  
    daily  
    missingok  
    rotate 14  
    compress  
    delaycompress  
    notifempty  
    create 0640 www-data adm  
    sharedscripts  
    postrotate  
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`  
    endscript  
}

配置项分步解析

  1. 日志文件路径匹配
    /var/log/nginx/*.log 使用通配符匹配所有nginx日志文件

  2. 周期与保留策略

    • daily 每日执行轮转
    • rotate 14 保留14天的归档文件(包含当前日志)
  3. 压缩策略

    • compress 启用压缩
    • delaycompress 延迟到第二次轮转时才压缩,确保单个归档文件包含完整周期日志
  4. 权限与创建规则
    create 0640 www-data adm 轮转后新建日志文件,权限为640,属主为www-data,属组为adm

  5. 脚本触发
    postrotate ... endscript 块定义轮转后的操作:

    • 检查nginx进程是否存在
    • 向nginx发送USR1信号,使其重新打开日志文件(避免日志句柄失效)

logrotate命令行使用场景

虽然logrotate通常以守护进程形式运行,但开发者也可以通过命令行直接调用:

常用命令格式

logrotate -d /etc/logrotate.conf  

logrotate -f /etc/logrotate.conf  

logrotate --version  

关键参数说明

参数作用描述
-d, --debug以调试模式运行,输出详细执行过程
-f, --force强制执行轮转,忽略周期和大小限制
-m, --state FILE指定状态文件路径(默认为/var/lib/logrotate.status)
-v, --verbose显示详细执行信息

典型配置场景与案例

场景1:每日轮转并保留30天日志

/var/log/myapp/app.log {  
    daily  
    rotate 30  
    compress  
    missingok  
    notifempty  
    create 0644 appuser appgroup  
    sharedscripts  
    postrotate  
        echo "Log rotated at $(date)" >> /var/log/myapp/rotate.log  
    endscript  
}

配置要点

  • rotate 30 确保保留30天归档文件
  • postrotate 块记录轮转事件到专用日志文件

场景2:按大小触发轮转(适合高频日志)

/var/log/syslog {  
    size 100M  
    rotate 5  
    compress  
    missingok  
    create 0640 root adm  
    postrotate  
        /usr/lib/rsyslog/rsyslog-rotate  
    endscript  
}

配置要点

  • size 100M 当日志文件达到100MB时触发轮转
  • 通过postrotate调用rsyslog的专用轮转脚本

场景3:多日志文件统一管理

/path/to/logs/*.log {  
    weekly  
    rotate 4  
    compress  
    missingok  
    notifempty  
    create 0644 user group  
    postrotate  
        /usr/local/bin/custom_hook.sh $1 $2  
    endscript  
}

配置要点

  • 通过$1$2传递日志文件名和归档名到自定义脚本
  • 实现复杂后处理逻辑(如日志上传到云存储)

进阶技巧与常见问题

技巧1:使用prerotate/postrotate实现复杂逻辑

/var/log/custom.log {  
    monthly  
    rotate 12  
    compress  
    missingok  
    notifempty  
    create 0644 user group  
    prerotate  
        # 轮转前执行  
        echo "Starting rotation at $(date)" >> /var/log/rotation.log  
    endscript  
    postrotate  
        # 轮转后执行  
        curl -X POST "https://api.example.com/logrotated"  
    endscript  
}

通过prerotatepostrotate可以分别定义轮转前后的操作,适用于需要触发外部通知或备份的场景。

技巧2:动态生成配置文件

对于容器化环境或需要自动化部署的场景,可以利用Jinja模板或Ansible模板动态生成logrotate配置:

{%- for app in apps %}
/{{ app.log_path }} {  
    daily  
    rotate {{ app.rotation_days }}  
    compress  
    create 0644 {{ app.user }} {{ app.group }}  
    postrotate  
        systemctl reload {{ app.service }}  
    endscript  
}
{%- endfor %}

常见问题与解决方案

  1. 日志文件未被轮转

    • 检查文件路径是否正确
    • 确认日志文件是否被其他进程锁定(如lsof /var/log/app.log
    • 使用logrotate -d调试配置
  2. 归档文件未压缩

    • 确认配置中包含compress指令
    • 检查压缩命令是否存在(如gzipbzip2
  3. 轮转后服务无法写入日志

    • 检查create指令的权限和属主设置
    • 确保postrotate中执行了服务重启/重载操作

总结与最佳实践

通过掌握Linux logrotate命令,开发者可以系统化地管理日志文件生命周期,避免因日志膨胀导致的存储危机。关键配置原则包括:

  1. 按需配置:根据日志生成频率和存储容量,合理设置rotatesize参数
  2. 渐进式压缩:配合delaycompress确保跨周期压缩的完整性
  3. 安全兜底:使用missingoknotifempty避免误操作
  4. 自动化集成:通过postrotate与CI/CD、监控系统联动

随着云计算和微服务架构的普及,日志管理已成为系统可靠性的重要组成部分。善用logrotate不仅能提升运维效率,更能为日志分析、审计追踪等高级场景奠定基础。建议开发者定期检查logrotate状态文件(/var/lib/logrotate.status),并根据业务需求动态调整配置策略。

最新发布