Nginx日志切割

Nginx日志切割,其必要性也没必要说那么多了,主要记录几种Nginx日志切割的方法,其实原理都大同小异,主要还是通过每天把日志按照日期备份的方式,使用kill -USR1指令重新生成新的日志。可以完全通过Shell脚本实现,也可以通过Shell+Cron定时任务实现,还可以使用logrotate日志轮询来进行分割。

####纯Shell实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
Logs_path="/data/Application/nginx/logs"
Pid_path="/data/Application/nginx/nginx.pid"
Month=`date +%Y-%m`
Date=`date +%Y-%m-%d`
Time=`date +%H`
WaitTime=$((24*60*60))

LogCut()
{
cd $Logs_path
mkdir -p $Month
while true
do
mv $Logs_path/access.log $Logs_path/$Month/access_$Date.log
kill -USR1 `cat ${Pid_path}`
done
sleep $WaitTime
return 0
}

case $1 in
start)
LogCut >/dev/null &
;;
stop)
kill -9 `ps aux | grep LogCut | grep -v grep | awk '{print $2}'`>/dev/null
;;
restart)
kill -9 `ps aux | grep LogCut | grep -v grep | awk '{print $2}'`>/dev/null
LogCut >/dev/null &
;;
*)
echo "Usage ERROR!Please use "start" or "stop" or "restart"!"
esac

####Shell+Cron实现
其实这种方法只是将上面的脚本case以下的部分体换成了cron定时任务,唯一的不通在于,上面的脚本执行之后,会在每隔24小时之后的时刻执行,而cron是可以指定一天的任一时刻的。

crontab -e

1
0 0 * * * /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1

每天的凌晨0点执行。

####logrotate日志轮询

/etc/logrotate.d/文件下,有很多日志轮询配置文件,这里的日志全都可以实现日志的自动切割,同样也可以把nginx的日志切割配置文件放在这里来实现目的。

1
vim /etc/logrotate.d/nginx

1
2
3
4
5
6
7
8
9
10
/data/Application/nginx/logs/access.log   #要切割的nginx日志所在目录 
{
nocompress #不对日志文件进行转储压缩
daily #指定转储周期为每天
copytruncate #用于还在打开中的日志文件,把当前日志备份并截断
create #建立新的日志文件
ifempty #即使是空文件也转储
olddir /data/nginx_logs/days #转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
rotate 0 #指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5个备份
}