nginx 日志切割

January 12, 2018

前端技术

在新的服务器上搭建网站已经有一小段时间了,这几天心血来潮,想看一下服务器的访问日志情况。前天写了一个小脚本,分析 nginx 的 access.log 日志。然后写了一个定时脚本,每天 03:30 的时候分析 access.log 然后输出一个文档。为什么是 3:30 呢,因为我看见日志目录下,每天的三点半多一些的时候,会自动生成一个 access.log-201ymmdd.gz 的文件。于是我在这个时间点之前分析一下,虽然不是很精确,但是那点误差我还是可以接收的。

但是很不幸,这两天发现分析的数据非常少,看一眼 access.log ,惊呆了,时间提前了,那么我三点半执行的脚本可不就是只分析了那么几分钟的访问量嘛。

[root@izj6cftv2j5c551cazkn5ez nginx]# ll /var/log/nginx
-rw-r--r-- 1 nginx nginx 308404 1月  12 12:01 access.log
-rw-r--r-- 1 nginx nginx  88204 1月  10 03:15 access.log-20180110.gz
-rw-r--r-- 1 nginx nginx  95550 1月  11 03:30 access.log-20180111.gz
-rw-r--r-- 1 root  root   69375 1月  12 03:07 access.log-20180112.gz

对于这个自动切割,打包压缩日志的功能,我得搞明白它,不然我怎么确定我的定时脚本的时间啊。网上搜了以下,关于 nginx 自动切割打包压缩日志的功能,都说 nginx 自身并不带这么一个功能,有很多教程在教你怎么写这么一个脚本来实现这个功能。但是我并没有写过啊,查看了一下 nginx 和 root 用户的 crontab ,也都没有这么一个脚本存在。

[root@izj6cftv2j5c551cazkn5ez nginx]# crontab -l -u nginx
no crontab for nginx

也有网友说是新版本的 nginx 有自带日志按天切割,压缩打包的功能,但是我的 nginx 的官网上并没有发现这样的描述,也没有找到对应设置的说明文档。nginx 推出这么一个功能肯定会有配套的说明文档的,也需要有对应的配置说明的,不然这个弹性很大的时间范围,不明显不适合在生产环境中使用的。

再接着查,后来查到这么一个工具, Logrotate ,Logrotate 是一个日志工具。相比之前网友分享的日志切割脚本,这个会更加完美一些。比如要保证日志切割的时候,不能影响日志的写入。这样的功能在简单的脚本上肯定会有些问题,但是毕竟大家的访问量并没有那么高,精确要求也没有那么高,所以也可以接收。Logrotate 是一个日志工具,它的执行还是需要借助 cron 。在 /etc/ 目录下,发现了这么几个目录

drwxr-xr-x.  2 root root     4096 10月 15 23:24 cron.d
drwxr-xr-x.  2 root root     4096 10月 15 23:19 cron.daily
-rw-------.  1 root root        0 8月   3 23:33 cron.deny
drwxr-xr-x.  2 root root     4096 10月 15 23:19 cron.hourly
drwxr-xr-x.  2 root root     4096 6月  10 2014 cron.monthly

很明显,cron.daily 是每日的脚本,在 /etc/cron.daily/ 目录下,我们发现了 logrotate 文件,绝对位置为 /etc/cron.daily/logrotate。文件如下

[root@izj6cftv2j5c551cazkn5ez cron.daily]# cat /etc/cron.daily/logrotate 
#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

虽然看不大懂说明意思,但是大致明白这里干了一件重要的事情,执行 logrotate logrotate.conf。接下来,就是看一下 logrotate.conf 里是什么。

[root@izj6cftv2j5c551cazkn5ez cron.daily]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}
# system-specific logs may be also be configured here.

这里好像没有咱们想要的脚本,但是发现 include /etc/logrotate.d 这行代码,很熟悉。跟我们的 nginx 的 conf.d 一个套路,我们看一下这个目录里有啥。

[root@izj6cftv2j5c551cazkn5ez logrotate.d]# ll /etc/logrotate.d/
-rw-r--r--. 1 root root  76 8月   2 00:24 bootlog
-rw-r--r--. 1 root root 160 1月  31 2017 chrony
-rw-r--r--  1 root root 194 10月 20 00:44 httpd
-rw-r--r--  1 root root 844 9月  14 00:27 mysql
-rw-r--r--  1 root root 243 10月 18 16:08 nginx
-rw-r--r--  1 root root 203 11月 16 00:36 php-fpm
-rw-r--r--. 1 root root 224 5月  10 2017 syslog
-rw-r--r--. 1 root root 100 8月   4 14:47 wpa_supplicant
-rw-r--r--. 1 root root 100 8月   6 03:13 yum

这个 nginx 文件应该就是咱们关心的内容了,打开看看。

[root@izj6cftv2j5c551cazkn5ez logrotate.d]# cat /etc/logrotate.d/nginx 
/var/log/nginx/*log {
    create 0644 nginx nginx
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

这个配置文件大概就是告诉 logrotate 怎么处理 /var/log/nginx/*log 的文件了。但是这里并没有指出执行脚本的时间点,是说了频率是 daily 。

logrotate 是一个切割日志的工具,执行脚本的时间点的事情,应该是 cron 来负责的。所以我们再去看看 cron 。

在网上查了一下。cron 有个配置文件 /etc/crontab,但是在这个文件里,并没有发现什么。

[root@izj6cftv2j5c551cazkn5ez etc]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

在新版的 centOS 中,配置文件为 /etc/anacrontab,文件中有 START_HOURS_RANGE=3-22 ,表明日常脚本的执行时间段。

[root@izj6cftv2j5c551cazkn5ez etc]# cat /etc/anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5   cron.daily      nice run-parts /etc/cron.daily
7       25  cron.weekly     nice run-parts /etc/cron.weekly
@monthly     45 cron.monthly        nice run-parts /etc/cron.monthly

到这里,大概就明白了,在 /etc/anacrontab 中,设置了每日定时脚本启动的时间,在 3 点到 22 点之间,每日日志脚本切割和压缩打包的工具是 logrotate 。和 nginx 本身可能没有什么特别的关系。

--- EOF ---

评论

  1. 文章不错非常喜欢

  2. 这个文章不回对不起自己!

添加新评论