logrotate 使用指南

logrotate 使用指南

logrotate 是一个强大的 Linux 日志管理工具,用于自动轮转、压缩、删除和归档日志文件,防止日志占用过多磁盘空间。本文详细讲解 logrotate 的工作原理、配置方法、常用选项,并提供多个实际使用示例。

一、logrotate 工作原理

logrotate 通常由系统的 cron 定时任务(默认位于 /etc/cron.daily/logrotate)每天运行,根据配置文件检查日志文件是否需要轮转。轮转的触发条件包括文件大小、时间周期等。

轮转过程包括:

  1. 重命名当前日志文件(如 app.log 改为 app.log.1)。
  2. 创建新的空日志文件。
  3. 压缩旧日志文件(如 app.log.1 压缩为 app.log.1.gz)。
  4. 删除过旧的日志文件。
  5. 执行自定义脚本(如通知服务重新打开日志文件)。

二、配置文件结构

主配置文件位于 /etc/logrotate.conf,包含全局设置。特定应用的轮转规则通常放在 /etc/logrotate.d/ 目录下的独立文件中。

1. 配置文件语法

配置文件由多个块组成,每个块定义一组日志文件的轮转规则,格式如下:

/path/to/logfile {
    选项1
    选项2
    ...
}

2. 常用选项

以下是常用配置选项:

  • 轮转触发条件

    • size <大小>:文件达到指定大小时轮转(如 size 100M)。
    • daily:每天轮转。
    • weekly:每周轮转。
    • monthly:每月轮转。
  • 轮转后处理

    • rotate <次数>:保留的轮转文件数量(如 rotate 7)。
    • compress:压缩旧日志文件(通常使用 gzip)。
    • delaycompress:推迟压缩到下次轮转。
    • missingok:日志文件不存在时不报错。
    • notifempty:空日志不轮转。
    • create <权限> <用户> <组>:创建新日志文件并指定权限等(如 create 0644 root root)。
    • copytruncate:复制后截断原文件,适合无法重启的服务。
  • 脚本执行

    • prerotate:轮转前执行的脚本。
    • postrotate:轮转后执行的脚本。
  • 其他

    • olddir <目录>:将轮转日志移动到指定目录。
    • maxage <天数>:删除超过指定天数的日志。
    • dateext:轮转文件名添加日期后缀(如 app.log-20250423)。

3. 全局配置

/etc/logrotate.conf 中设置全局选项,适用于所有日志文件,除非被 /etc/logrotate.d/ 中的配置覆盖。例如:

weekly
rotate 4
create
compress
include /etc/logrotate.d

三、运行方式

  1. 手动运行

    • 运行:logrotate /etc/logrotate.conf
    • 强制执行:logrotate -f /etc/logrotate.conf
    • 调试:logrotate -d /etc/logrotate.conf(仅模拟,不实际执行)
  2. 定时运行
    默认通过 /etc/cron.daily/logrotate 每天运行,可修改 cron 调整频率。

  3. 状态文件
    状态文件(/var/lib/logrotate/status)记录每个日志的最后轮转时间。

四、实际使用示例

以下是针对不同场景的 logrotate 配置示例。

示例 1:Nginx 日志(每天轮转)

为 Nginx 日志配置每天轮转,保留 7 天,压缩旧日志并重启 Nginx。

配置文件:/etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 nginx nginx
    postrotate
        /usr/sbin/nginx -s reopen
    endscript
}

说明

  • 每天轮转,保留 7 个旧日志。
  • 压缩旧日志,推迟到下次轮转。
  • 轮转后通知 Nginx 重新打开日志文件。

结果

  • access.log 轮转为 access.log.1,下次为 access.log.2.gz
  • 保留 7 个旧日志。

示例 2:应用程序日志(基于大小)

为应用日志配置基于大小的轮转,超过 100MB 触发,保留 5 个日志,添加日期后缀。

配置文件:/etc/logrotate.d/myapp

/var/log/myapp/app.log {
    size 100M
    rotate 5
    dateext
    compress
    missingok
    copytruncate
}

说明

  • 文件超 100MB 轮转,保留 5 个日志。
  • 使用日期后缀(如 app.log-20250423)。
  • 复制并截断原文件,适合无法重启的应用。

结果

  • app.log 超 100MB 轮转为 app.log-20250423,原文件截断。
  • 旧日志压缩为 .gz,保留 5 个。

示例 3:系统日志(存档到目录)

/var/log/syslog 配置每月轮转,保留 12 个月,存档到指定目录。

配置文件:/etc/logrotate.d/syslog

/var/log/syslog {
    monthly
    rotate 12
    compress
    olddir /var/log/archive
    maxage 365
    missingok
    notifempty
    create 0640 root adm
}

说明

  • 每月轮转,保留 12 个日志。
  • 旧日志存到 /var/log/archive,超过 365 天删除。
  • 新日志文件权限为 0640,属主 root,属组 adm。

结果

  • syslog 轮转为 /var/log/archive/syslog.1.gz
  • 保留 12 个月,超期删除。

示例 4:数据库日志(复杂脚本)

为数据库日志配置每周轮转,保留 4 周,轮转前备份到远程服务器。

配置文件:/etc/logrotate.d/database

/var/log/db/*.log {
    weekly
    rotate 4
    compress
    missingok
    prerotate
        /bin/cp /var/log/db/*.log /tmp/db_backup/
        /usr/bin/scp /tmp/db_backup/*.log user@remote:/backup/
    endscript
    postrotate
        /bin/rm -f /tmp/db_backup/*.log
    endscript
}

说明

  • 每周轮转,保留 4 个日志。
  • 轮转前备份日志到远程服务器,轮转后清理临时文件。

结果

  • 日志每周轮转,旧日志压缩。
  • 备份到远程服务器,临时文件清理。

五、注意事项

  1. 权限

    • 确保 logrotate(通常以 root 运行)有权限操作日志文件和脚本。
    • 检查 createolddir 的权限。
  2. 测试

    • 使用 logrotate -d 调试配置。
    • 使用 logrotate -f 测试实际效果。
  3. 服务重启

    • 使用 postrotate 确保服务正确切换日志。
    • 无法重启的服务使用 copytruncate
  4. 磁盘空间

    • 定期检查日志占用,确保 compressmaxage 有效。
    • 确认 olddir 目录空间充足。
  5. 状态文件

    • 检查 /var/lib/logrotate/status 是否正确更新。

六、总结

logrotate 是管理日志的理想工具,灵活的配置选项支持各种场景。关键是根据日志特性选择触发条件、控制存储空间,并利用脚本处理复杂需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值