分享个人 Full-Stack JavaScript 项目开发经验
CentOS 7 默认提供的日志滚动处理程序 logrotate 可以帮助我们自动滚动、备份、压缩、删除 nginx 日志文件。当 nginx 或其反向代理的上游服务器遇到问题时,就可以更方便地定位到发生错误时的具体日志文件,然后分析并找出错误原因。本文将介绍 logrotate 的工作方式和通过 RPM 安装的 nginx 默认的 logrotate 配置。
目录 /etc/cron.{daily,weekly,monthly} 下的系统常规计划任务脚本文件,由计划任务守护进程 crond 调用 anacron(anachronistic cron)程序处理。anacron 是针对非全天候运行而设计的,也就是说它不会因为时间不连续而遗漏计划任务的执行。当 anacron 发现时间不连续时,它会执行这段时间内用该执行的任务。
logrotate 就是由 crond 运行的,它的默认配置文件为 /etc/cron.daily/logrotate。所以 crond 每天执行一次 logrotate,执行时读取它的主配置文件 /etc/logrotate.conf。换句话说,修改完 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 说明。