Skip to content

logrotate工具介绍

基本概念

logrotate是 Linux/Unix 系统中用于管理系统日志文件的核心工具,主要功能是:

  • 自动轮转:定期重命名、压缩、删除旧的日志文件
  • 防止磁盘占满:避免日志文件无限制增长
  • 保持日志有序:按时间或大小组织日志文件
  • 减少存储空间:自动压缩旧日志

工作流程示例

假设有日志文件 /var/log/messages

初始:messages
第一次轮转:messages → messages.1(新messages为空文件)
第二次轮转:messages.1 → messages.2,messages → messages.1
第三次轮转:messages.2 → messages.3,messages.1 → messages.2,messages → messages.1
... 以此类推

核心配置文件

主配置文件

bash
/etc/logrotate.conf          # 全局默认配置

服务特定配置

bash
/etc/logrotate.d/           # 目录,存放各服务的独立配置
/etc/logrotate.d/rsyslog    # rsyslog 服务的日志配置
/etc/logrotate.d/nginx      # Nginx 日志配置
/etc/logrotate.d/apache2    # Apache 日志配置

常用配置参数详解

轮转触发条件

bash
daily              # 每天轮转一次
weekly             # 每周轮转一次
monthly            # 每月轮转一次
size 10M           # 文件达到 10MB 时轮转
size 100k          # 文件达到 100KB 时轮转
size 1G            # 文件达到 1GB 时轮转
maxsize 100M       # 即使未到周期,超过大小也轮转

文件保留策略

bash
rotate 7           # 保留 7 个轮转文件
rotate 365         # 保留 365 个轮转文件
rotate 0           # 不保留任何旧文件

文件命名方式

bash
dateext           # 使用日期作为后缀(messages-20251224)
dateformat .%Y%m%d  # 自定义日期格式
extension .log    # 轮转后文件扩展名

压缩与清理

bash
compress          # 使用 gzip 压缩旧日志
nocompress        # 不压缩
compresscmd /bin/bzip2  # 指定压缩程序
compressoptions -9      # 压缩选项(最大压缩)
delaycompress     # 延迟压缩(下一次轮转时再压缩)

文件创建与权限

bash
create 0644 root root  # 创建新文件,设置权限和所有者
create 0640 root adm
nocreate             # 不创建新文件

邮件相关

bash
mail user@domain.com  # 删除旧日志前邮件通知
mailfirst           # 轮转前发送邮件
maillast            # 轮转后发送邮件(默认)
nomail              # 不发送邮件

脚本钩子

bash
prerotate          # 轮转前执行的脚本
    /usr/bin/command
endscript

postrotate         # 轮转后执行的脚本
    /bin/kill -HUP `cat /var/run/service.pid`
endscript

其他常用选项

bash
missingok          # 日志不存在时不报错
notifempty         # 空文件不轮转
ifempty            # 空文件也轮转(默认)
sharedscripts      # 多个日志共享 prerotate/postrotate
copytruncate       # 复制后截断,代替移动(适用于某些不能重命名的程序)

完整配置示例

系统关键日志(长时间保留)

bash
/var/log/messages
/var/log/secure
/var/log/cron
{
    daily               # 每日轮转
    rotate 365          # 保留 365 个轮转文件
    compress            # 使用 gzip 压缩旧日志
    dateext             # 使用日期作为后缀(messages-20251224)
    dateformat -%Y%m%d  # 自定义日期格式
    missingok           # 日志不存在时不报错
    notifempty          # 空文件不轮转
    sharedscripts       # 多个日志共享 prerotate/postrotate
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

常用命令

测试配置文件(不实际执行)

bash
logrotate -d /etc/logrotate.conf          # 调试模式
logrotate -d /etc/logrotate.d/rsyslog     # 调试特定配置

强制执行轮转

bash
logrotate -f /etc/logrotate.conf          # 强制轮转
logrotate -f /etc/logrotate.d/nginx      # 强制轮转 Nginx 日志

查看详细信息

bash
logrotate -v /etc/logrotate.conf          # 详细输出
logrotate -v -f /etc/logrotate.conf       # 强制并显示详情

使用状态文件

bash
logrotate -s /var/lib/logrotate.status /etc/logrotate.conf

自动执行机制

logrotate 通常通过 cron 自动运行:

bash
# 查看 logrotate 的 cron 任务
cat /etc/cron.daily/logrotate

# 内容通常类似:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf