继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

日志大了,怎么办?用我的日志切割脚本吧!

Jeson
关注TA
已关注
手记 74
粉丝 2万
获赞 3370

分享一个脚本,它配合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[@]}

do

    if [ ${logname} == 'error' ];then

        LOG_FILE=${NGINX_ERROR_PATH}/${logname}.log

        BACK_DIR=${NGINX_ERROR_PATH}/${logname}

    else

        LOG_FILE=${NGINX_ACCESS_PATH}/${logname}.log

        BACK_DIR=${NGINX_ACCESS_PATH}/${logname}

    fi

    if [ $1 == "size" ];then

         file_size=`Get_Size ${LOG_FILE}`

         Log_Rotate ${file_size} ${LOG_FILE} ${BACK_DIR}

         echo $file_size

    elif [ $1 == "day" ];then

         Log_Rotate ${file_size} ${LOG_FILE} ${BACK_DIR}

    else

       echo "Param : $logname error!"

    fi

done

#給nginx发送一个信号量,让nginx重载,重新重新生成日志

## restart nginx

[ ! -f $Nginxpid ]  kill -USR1 $(cat $Nginxpid)

[欢迎大家继续关注我在imooc的文章 ,jeson@imooc.com]

打开App,阅读手记
55人推荐
发表评论
随时随地看视频慕课网APP

热门评论

系统都有自带的 logrotate 工具

写的非常好, 周一早上就看到这篇!为好兄弟点个赞! 

大神啊. 

nginx发送一个信号量,让nginx重载,重新重新生成日志

[ ! -f $Nginxpid ] kill -USR1 $(cat $Nginxpid)
不懂这个,  nginx -s  reload  不就可以了吗?

求回复。

查看全部评论