GX博客

分享个人 Full-Stack JavaScript 项目开发经验

使用日志滚动处理程序logrotate管理nginx日志文件

CentOS 7 默认提供的日志滚动处理程序 logrotate 可以帮助我们自动滚动、备份、压缩、删除 nginx 日志文件。当 nginx 或其反向代理的上游服务器遇到问题时,就可以更方便地定位到发生错误时的具体日志文件,然后分析并找出错误原因。本文将介绍 logrotate 的工作方式和通过 RPM 安装的 nginx 默认的 logrotate 配置。


logrotate的工作方式

目录 /etc/cron.{daily,weekly,monthly} 下的系统常规计划任务脚本文件,由计划任务守护进程 crond 调用 anacron(anachronistic cron)程序处理。anacron 是针对非全天候运行而设计的,也就是说它不会因为时间不连续而遗漏计划任务的执行。当 anacron 发现时间不连续时,它会执行这段时间内用该执行的任务。

logrotate 就是由 crond 运行的,它的默认配置文件为 /etc/cron.daily/logrotate。所以 crond 每天执行一次 logrotate,执行时读取它的主配置文件 /etc/logrotate.conf。换句话说,修改完 logrotate 配置后,它将会在下次执行时生效。

nginx的logrotate配置

logrotate 的主配置文件是 /etc/logrotate.conf,它包含全局的配置语句:

# 指定日志滚动周期为每周
weekly

# 指定日志文件删除之前滚动的备份次数,0 代表旧的日志文件会被删除而不是滚动
rotate 4

# 在回滚日志文件创建之后,postrotate 脚本执行之前,创建一个相同权限相同名字的新的空日志文件。可以使用 nocreate 禁用该行为
create

# 使用日期作为滚动日志文件后缀,如 access.log-20190928
dateext

# RPM 包会将对应的日志滚动配置文件放置于该目录下
include /etc/logrotate.d

# wtmp 和 btmp 的配置,因为它们没有自己的 RPM 包,所以配置写在这里
/var/log/wtmp {
    monthly
    create 0664 root utmp
	minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

通过 RPM 安装的 nginx,会在 /etc/logrotate.d 目录下生成 nginx 日志滚动配置文件 /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    create 640 nginx adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

上述配置作用于 /var/log/nginx/ 目录下的所有 .log 文件,其中配置项的说明如下:

  • daily

    指定日志滚动周期为每天。

  • missingok

    当要滚动的日志文件不存在时,继续处理下一个,而不会发出错误信息。

  • compress

    对滚动的旧日志文件使用 gzip 压缩。

  • delaycompress

    滚动的日志文件在下次的滚动时才压缩。

  • notifempty

    如果要滚动的日志文件为空文件,则不滚动日志。默认值为 ifempty。

  • sharedscripts

    当配置匹配的日志文件有多个时,使 prerotate 和 postrotate 的脚本只会执行一次。

  • postrotate/endscript

    在日志滚动后需要执行的命令,这两关键字需要独占一行。

其中 postrotate/endscript 中脚本的意思为,当日志滚动后,向 nginx 主线程发送重新生成新日志的信号。


CentOS 7 下可以通过 man logrotate 指令了解更详细的 logrotate 说明。

版权声明:

本文为博主原创文章,若需转载,须注明出处,添加原文链接。

https://leeguangxing.cn/blog_post_67.html