Nginx 的日志都是写在一个文件当中的,不会自动地进行切割,如果访问量很大的话,将导致日志文件容量非常大,不便于管理和造成Nginx 日志写入效率低下等问题。所以,往往需要要对access_log、error_log日志进行切割。
切割日志一般利用USR1信号让nginx产生新的日志。实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#!/bin/bash
logdir="/data/logs/nginx" pid=`cat $logdir/nginx.pid` DATE=`date -d "1 hours ago" +%Y%m%d%H` DATE_OLD=`date -d "7 days ago" +%Y%m%d` for i in `ls $logdir/*access.log`; do mv $i $i.$DATE done for i in `ls $logdir/*error.log`; do mv $i $i.$DATE done kill -s USR1 $pid rm -v $logdir"/access.log."$DATE_OLD*
rm -v $logdir"/error.log."$DATE_OLD*
|
1、分析:
- 将上面的脚本放到crontab中,每小时执行一次(0 ),这样每小时会把当前日志重命名成一个新文件;然后发送USR1这个信号让Nginx 重新生成一个新的日志。(相当于备份日志)
- 将前7天的日志删除;
2、说明:
在没有执行kill -USR1 $pid之前,即便已经对文件执行了mv命令而改变了文件名称,nginx还是会向新命名的文件”*access.log.2016032623”照常写入日志数据的。原因在于:linux系统中,内核是根据文件描述符来找文件的。
3、logrotates:
使用系统自带的logrotates,也可以实现nginx的日志分割,查看其bash源码,发现也是发送USR1这个信号。
Nginx 日志自动分割
原文:http://www.cnblogs.com/fjping0606/p/7944507.html