Linux 实用小脚本系列(4)--使用脚本自动切割NGINX日志
这里的切割的意思是将NGINX的access和error这两个主要日志按照天数压缩并存放在一个专门的目录内,并将超过10天的日志自动删除。大家都知道,每天都是以0点0分0秒为界限,分隔天数,因此,脚本的执行时间也就为每天的0点0分(crontab默认不支持秒级任务的哦),下面上代码。
#!/bin/bash
#!author zsk_john
set -eu
set -o pipefail
date=$(date +%F -d -1day)
log_path=/usr/local/nginx/logs
if [ ! -d $log_path/cut ] ; then
mkdir $log_path/cut
fi
mv $log_path/access.log $log_path/cut/access_$(date +%F -d -1day).log
mv $log_path/error.log $log_path/cut/error_$(date +%F -d -1day).log
/usr/local/nginx/sbin/nginx -s reload
tar -jcf $log_path/cut/$date.tar.bz2 $log_path/cut/*
rm -rf $log_path/cut/access* && rm -rf $log_path/cut/error*
cat >>/var/spool/cron/root<<eof
00 00 * * * /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh >/dev/null 2>&1
eof
find $log_path -type f -mtime +10 | xargs rm -rf
使用了set -eu,表示该脚本遇到错误会停止,防止后续破坏,同时检查脚本内的变量,变量值为空则脚本停止运行。以保证最后一行不会遇到空值对系统造成损害,set -o pipefail 检查管道命令,防止set -e的漏检现象。
首先定义了两个变量。一个是日期的变量,一个是指定日志文件的原始路径。
如果,该原始路径下没有cut文件夹,那么新建cut这个文件夹。
将这两个NGINX所产生出来的日志文件移动到cut文件夹下,在移动的同时以当前日期为名重命令文件。
由于是移动了文件,所以重新加载服务使得NGINX继续生成日志。
压缩所移动并重命名的两个文件,压缩名为当前日期+bz2。(需要注意一点,最小化安装的系统并没有bzip2命令,请yum安装bzip2,否则脚本无法执行,也就是执行 yum install bzip2 -y 命令)
删除原文件,免得占用空间、
倒数第三行的 /bin/sh /usr/local/nginx/logs/cut_nginx_log.sh 这个是脚本的路径和名称,请根据自己实际情况修改
crontab定时任务,每天的0点0分执行该脚本。
删除10天以上的压缩日志文件。