nginx访问日志并没有Apache那样每天自动进行切割的配置,而服务器文件系统IO不给力时,不加以切割的文件体积较大的nginx访问日志将会带来服务器额外的开销,我手头的一台服务器跑了几个小网站,为了便于各个小网站的日志管理,写了一个bash脚本使用crontab定时任务每天凌晨2点进行日志切割。
就不拿我的这个生产环境的日志切割做说明了,下面就这个centos下nginx日志切割进行一些原理讲解,各位依据自己的生产环境酌情书写bash脚本即可。
-----
假设nginx配置中将nginx的各个站点的access日志放置在/server/log/目录下,对应关系如下:
1、www.jjonline.cn的access日志为/server/log/www.jjonline.cn.log
2、blog.jjonline.cn的access日志为/server/log/blog.jjonline.cn.log
3、m.jjonline.cn的access日志为/server/log/m.jjonline.cn.log
......等等诸如此类,就不再逐一列举。
-----
找到的一些bash文件比较运算符代码知识点列举如下:
bash里的if语句体为
#!/bin/bash
if [ condition ]
then
echo "true"
else
echo "false"
fi
#condition即为判定条件,若为真则直线then后的语句,假则直线else后的语句 fi为语句结束
上述condition应用到nginx的日志切割就是判定指定日志是否存在(或者指定的日志文件是否存在且内容是不是为空)后进行日志的移动并且重命名的操作(切割)。
- -b file 若文件存在且是一个块特殊文件,则为真
- -c file 若文件存在且是一个字符特殊文件,则为真
- -d file 若文件存在且是一个目录,则为真
- -e file 若文件存在,则为真
- -f file 若文件存在且是一个规则文件,则为真
- -g file 若文件存在且设置了SGID位的值,则为真
- -h file 若文件存在且为一个符合链接,则为真
- -k file 若文件存在且设置了"sticky"位的值
- -li file 若文件存在且为一已命名管道,则为真
- -r file 若文件存在且可读,则为真
- -s file 若文件存在且其大小大于零,则为真
- -u file 若文件存在且设置了SUID位,则为真
- -w file 若文件存在且可写,则为真
- -x file 若文件存在且可执行,则为真
- -o file 若文件存在且被有效用户ID所拥有,则为真
- -L file 若文件为符号链接,则为真
- -z string 若string长度为0,则为真
- -n string 若string长度不为0,则为真
- string1 = string2 若两个字符串相等,则为真
- string1 != string2 若两个字符串不相等,则为真
- int1 -eq int2 若int1等于int2,则为真
- int1 -ne int2 若int1不等于int2,则为真
- int1 -lt int2 若int1小于int2,则为真
- int1 -le int2 若int1小于等于int2,则为真
- int1 -gt int2 若int1大于int2,则为真
- int1 -ge int2 若int1大于等于int2,则为真
- exlir1 -a exlir2 若exlir1和exlir2都为真则整式为真
- exlir1 -o exlir2 若exlir1和exlir2有一个为真则整式为真
- file1 -nt file2 若file1 比 file2 新,则为真
- file1 -ot file2 若file1 比 file2 旧,则为真
看到上方列出了一堆判定条件,用于我们的nginx日志切割的就一点:“ -s file”,也就是判定文件是否存在且该文件是否体积为零(对nginx的日志文件来说,存在但没有任何记录若再切割就没有什么意义了)。
基于此,可以在/server/log下vi一个cutLog.sh文件书写用于crontab定时任务的bash脚本了,直接列出脚本内容,脚本内会有相应解释。
#nginx log event sh
#author: JJonline.CN
#!/bin/bash
#log path (nginx日志存储的目录)
logs_path="/server/log/"
#whereis Pid file(nginx启动后的pid文件位置)
pid_path="/server/nginx.pid"
#www.jjonline.cn log
#判定/server/log/www.jjonline.cn.log文件是否存在且是否有内容
if [ -s ${logs_path}www.jjonline.cn.log ]
then
#判定有这个文件且这个文件内容不为空 就执行mv命令 对日志进行移动并且重命名
#意思就是将/server/log/www.jjonline.cn.log文件移动到 /server/log/CutLog/目录下并且利用昨天的时间(为什么?因为我的crontab任务是在凌晨2点执行的,而切割的日志是前一天的)进行重命名
#例如今天那么/server/log/www.jjonline.cn.log将被mv指令变成/server/log/CutLog/www.jjonline.cn_20140529.log
mv ${logs_path}www.jjonline.cn.log ${logs_path}CutLog/www.jjonline.cn_$(date -d "yesterday" +"%Y%m%d").log
fi
#重复执行blog.jjonline.cn站的nginx日志切割
#blog.jjonline.cn log
#同理 注意if与[之间的空格 以及[]与中间的判定语句之间的空格是必须要的
if [ -s ${logs_path}blog.jjonline.cn.log ]
then
mv ${logs_path}blog.jjonline.cn.log ${logs_path}CutLog/blog.jjonline.cn_$(date -d "yesterday" +"%Y%m%d").log
fi
#m.jjonline.cn log
if [ -s ${logs_path}m.jjonline.cn.log ]
then
mv ${logs_path}m.jjonline.cn.log ${logs_path}CutLog/m.jjonline.cn_$(date -d "yesterday" +"%Y%m%d").log
fi
#利用nginx的管道信号 让nginx重新加载配置文件--目的就是重新产生当天的nginx日志(之前的日志被mv移动走了)
#kill & reload
kill -USR1 `cat ${pid_path}`
这里要说的是,该脚本中有一个CutLog文件夹,也就是/server/log/CutLog这个可以依据具体情况改变,但这个文件夹必须存在;可以mkdir命令建立即可。
然后制作crontab定时任务;代码如下:
00 00 * * * /bin/bash /server/log/CuLog.sh
#每天凌晨0点0分执行该日志切割脚本
哟嚯,本文评论功能关闭啦~