在linux中一般用于日志自动化管理的是logrotate,它可以定时分割日志、压缩日志和删除沉余的日志;甚至还可以将日志发送到指定的邮箱里。

在Centos中,如果用yum安装nginx的话,会自动在logrotate.d中创建nginx的日志清理配置;不过nginx的改版openresty似乎没有自动创建这个配置文件;尽管网上有很多用shell脚本方式分割日志的,但我认为重复造轮子显然不合理,况且logrotate也很完善了,linux中默认预装的就有它,默认系统日志都是由它来处理的,比如bootlogsyslog

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
	sharedscripts
	dateext
	rotate 25
	size 2M
	#compress
	dateformat  -%Y%m%d%s
	postrotate
		/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
	endscript
}

显然,你就算不爽logrotate来分割nginx日志,觉的它占用太大,但你总不至于停止它,为每种日志都自己创建个脚本吧? 所以,还是老老实实地用logrotate吧,那我就再介绍一下它:


Logrotate是用anacron来配置的,anacron是由cron唤醒运行的,/etc/anacrontab的配置文件如下:

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

这里面主要是RANDOM_DELAY和START_HOURS_RANGE,防止多任务同时执行,同时又用nice设置了进程较低的优先度,总之,是最大限度的保障服务器其它程序的正常运行,很是灵活!所以,你还有什么好担心的呢?接下来我们说logrotate.conf的配置

# 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
notifempty
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

这里面是一些默认设置,具体参数意思可以参考linux logrotate 配置及测试一文,我只强调compressnotifempty参数,前者表示需要压缩,后者表示如果日志文件为空则略过,这两个都能对性能产生一定的影响,压缩一般还是很占cpu的,后者尤其是对长期不重启的服务器来说,bootlog显然是为空的,设置notifempyt后既能防止之前有内容的日志文件被删除又能节约占用,甚好!

通过include /etc/logrotate.d,我们可以知道在/etc/logrotate.d目录下就是各个服务的配置了
现在就来在/etc/logrotate.d新建一个openresty的配置文件

/usr/local/openresty/nginx/logs/*log {
     daily
    missingok
    rotate 7
    notifempty
    sharedscripts
    postrotate
		[ ! -f /usr/local/openresty/nginx/logs/nginx.pid ] || kill -USR1 `cat /usr/local/openresty/nginx/logs/nginx.pid`
    endscript
}

如果你是默认安装的openresty,可能这个配置文件一致,第一行是log的目录,postrotate是分割后的脚本,nginx.pid是nginx用来记录主进程pid的文件,在openresty中就在/usr/local/openresty/nginx/logs/目录下面,如果不一样,可更改为自己实际的路径!

差点忘了说了可以用以下命令更新logrotate配置

logrotate /etc/logrotate.conf

更新于:2017-12-19