使用 logrotate 转储日志

 

Logroate 配置及使用示例。

logrotate 配置文件路径

  • 执行程序: /usr/sbin/logrotate
  • 默认配置文件: /etc/logrotate.conf
  • 其它配置文件: /etc/logrotate.d/*

logrotate 默认读取 /etc/logrotate.conf 配置文件,通过 include /etc/logrotate.d 来加载其它配置文件。

logrotate 状态文件路径

  • /var/lib/logrotate.status

执行 logrotate

logrotate 本身不是 daemon 程序,它通过 cron 程序来定期执行。它的 cron 脚本通常放在 /etc/cron.daily/logrotate,因此 logrotate 会按天执行。

对于使用 size 指令来转储的日志,如果日志内容增长很快,那么就不适合按天来执行 logrotate,那样会导致日志文件的大小很快超过 size 设置的大小,而 logrotate 只在一天执行一次,所以不能及时转储。因此 size 指令不能保证你转储的日志文件大小与指令设置的大小一致,如果希望它们尽可能一致,你需要足够频繁的调用 logrotate

如果希望一天内多次执行 logrotate 来检查基于日志大小的转储,你可以:

  • 将 logrotate 的 cron 脚本从 cron.daily 移动到 cron.hourly,使其每小时执行一次

    mv /etc/cron.daily/logrotate /etc/cron.hourly/logrotate
    
  • 或直接添加 cron job,使其在更小的时间间隔执行。

    crontab -u root -e
    
    # 每15分钟执行一次 nginx 的日志转储
    */15 * * * * /usr/sbin/logrotate /etc/logrotate.d/nginx /dev/null 2>&1 &
    

logrotate 命令选项

查看版本

如果没有给出命令行参数,logrotate 将打印版本和版权信息,以及一个简短的使用摘要。

-d, –debug

--dry-run 一样,模拟一次执行,并输出执行信息,隐含了 --verbose 选项。

logrotate -d /etc/logrotate.d/nginx

-f, –force

强制执行一次转储,即使没有达到设定的阈值。

logrotate -f /etc/logrotate.d/nginx

-v, –verbose

执行并输出详细信息。

logrotate -v /etc/logrotate.conf

配置文件

示例1

# 为下面两个日志文件配置转储
/var/log/httpd/access.log
/var/log/httpd/error.log
{
    rotate 5        # 保留 5 份转储文件
    size 10M        # 日志文件超过 10M 后进行转储
    sharedscripts   # 如果两个日志文件同时达到转储条件,转储后只执行一次下面的脚本
    postrotate
        /usr/bin/killall -HUP httpd
        # 或
        # /bin/kill -HUP $(/bin/cat /var/run/httpd.pid 2>/dev/null) &>/dev/null
    endscript
}

logrotate 进行转储时,会重命名日志文件到转储文件,但进程还是持有原来打开的文件句柄,所以会继续向重命名后的转储文件写入日志信息,因此通过向进程发送 SIGHUP 信号通知其重载配置。

示例2

/var/log/nginx/*.log {
    rotate 7                        # 保留 7 份转储
    daily                           # 按天转储
    copytruncate                    # 复制日志文件到转储文件,并清空日志文件
    compress                        # 压缩转储日志,默认使用 gzip 命令压缩
    delaycompress                   # 将压缩推迟到下一次转储
    missingok                       # 如果不存在要转储的日志文件,跳到下一个日志文件,不会报错
    notifempty                      # 如果日志文件是空文件,不进行转储
    dateext                         # 在文件名后面添加日期,默认格式 YYYYMMDD
    dateformat -%Y-%m-%d            # 将日期扩展的格式的设置为 -YYYY-MM-DD
    extension .log                  # 将日志扩展名放到文件名末尾
    createolddir 0755 nginx nginx   # 如果不存在 olddir,则按照 chmod 格式创建
    olddir /var/log/nginx/archives  # 将转储后的日志文件放到指定目录
}

对于示例2,因为有些进程不接收系统信号,所以这里使用 copytruncate 指令,该指令不重命名日志文件,而复制日志文件内容到转储文件,然后清空日志文件内容。

注意:RedHat 6 上 logrotate 的默认版本是 3.7.8,该版本不支持 createolddir 指令,可以查看系统上的 logrotate(8) 手册 (man logroate) 来了解当前版本支持哪些指令。

假如有日志文件 /var/log/nginx/nginx.log,当时间超过一天后,会生成转储文件:

  • /var/log/nginx/archives/nginx-2020-04-15.log

两天后,生成第二个转储文件,并压缩前一个转储文件:

  • /var/log/nginx/archives/nginx-2020-04-16.log
  • /var/log/nginx/archives/nginx-2020-04-15.log.gz

logrotate 指令 (Directives)

minsize maxsizesize 的区别

minsize 当文件大小超过 minsize,并且超过指定时间间隔才会转储日志。例如:minsize 50Mhourly 表示当文件大小超过 50MB 并且自上次转储后过去了一个小时,才会进行转储。

maxsize 当文件大小超过 maxsize,或者超过指定时间间隔就会转储日志。例如: maxsize 50Mhourly 表示当文件大小超过 50MB 或者自上次转储后过了一个小时,就会进行转储。

size 只要文件大小超过 size 就会进行转储,与时间无关。

size directive logic time directive result
minsize 50M and hourly rotate
maxsize 50M or hourly rotate
size 50M - - rotate