日志大了,怎么办?用我的日志切割脚本吧!
分享一个脚本,它配合linux系统的crontab任务,对nginx自动日志切割和清理,分别作用于ACCESS和ERROR的日志。
特点:
1、功能丰富
应有的功能中,不仅支持按天切割,而且支持通过通过设置文件大小作切割。
2、通用
通用于nginx、tengine,通过简单改进也能有好的支持切割清理httpd、lightd等其他Web server 日志。
3、更加易于理解
用shell方式相对更加好理解,并且易于后续的维护和功能的添加。
好了,话不多说直接上脚本:
#!/bin/bash
#Jeson
#Email:jeson@iaskjob.com
#变量定义:access、error日志文件列表
NGINX_LOG=(imoocc_com_access iaskjob_com error)
NGINX_ACCESS_PATH=/opt/logs/nginx/access
NGINX_ERROR_PATH=/opt/logs/nginx/error
#日期变量
Ydate=`date -d yesterday +%Y%m%d`
Adate=`date -d "20 days ago" +%Y%m%d`
#PID文件和nginx.conf中定义一致
Nginxpid=/opt/app/nginx/nginx.pid
#日志的量,超过此值,触发切割
Max_size=1000000
file_size="NULL"
#函数Get_Size,获取日志文件的大小。
#rotate funcation
function Get_Size(){
logfile=$1
file_size=`ls -l ${logfile}awk '{print $5}'`
if [[ $file_size =~ [1-9]* ]];then
echo $file_size
else
echo "error:cant get file ${logfile} size!"
exit
fi
}
#函数Log_Rotate,完成日志轮转切割。
# rename log
function Log_Rotate(){
SIZE=$1
ACCESS_FILE=$2
BACK_DIR=$3
echo "==============$SIZE $ACCESS_FILE"
if [ $SIZE == "NULL" ];then
echo "######00000000"
if [ ! -d ${BACK_DIR} ];then
mkdir ${BACK_DIR}
fi
mv -f ${ACCESS_FILE} ${BACK_DIR}/${Ydate}.log
touch ${ACCESS_FILE}
rm ${BACK_DIR}/${Adate}.log
elif [ $SIZE -gt $Max_size ];then
echo "#######11111111"
if [ ! -d ${BACK_DIR} ];then
mkdir ${BACK_DIR}
fi
mv -f ${ACCESS_FILE} ${BACK_DIR}/${Ydate}.log
touch ${ACCESS_FILE}
rm ${BACK_DIR}/${Adate}.log
fi
}
#主功能段,作用遍历日志,输入参数为size,则按照size进行切割,如果为day,则按照日常轮转进行。
for logname in ${NGINX_LOG[@]}