您的位置:晶晶的博客>Linux>centos下nginx日志切割的bash脚本原理

centos下nginx日志切割的bash脚本原理

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
转载请注明本文标题和链接:《centos下nginx日志切割的bash脚本原理

相关推荐

哟嚯,本文评论功能关闭啦~