일지 가 크 면 어 떡 하지?내 로그 로 스 크 립 트 자 르 기

22965 단어
Liux 시스템 의 crontab 작업 에 맞 춰 nginx 자동 로그 절단 과 청 소 를 각각 ACCESS 와 ERROR 로그 에 사용 합 니 다.
특징:
1. 기능 이 풍부 하 다
제 기능 에 서 는 날짜 에 따라 자 르 는 것 을 지원 할 뿐만 아니 라 파일 크기 설정 을 통 해 자 르 는 것 도 지원 합 니 다.
2. 통용
nginx, tengine 에 사용 되 며 간단 한 개선 을 통 해 httpd, lightd 등 다른 웹 서버 로 그 를 잘 라 낼 수 있 습 니 다.
3. 이해 하기 쉽다
셸 방식 으로 상대 적 으로 이해 하기 쉽 고 후속 적 인 유지 와 기능 의 추가 가 용이 합 니 다.
자, 긴 말 하지 않 고 바로 스 크 립 트 에 올 립 니 다.
#!/bin/bash

#Jeson

#Email:[email protected]

#变量定义: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)

좋은 웹페이지 즐겨찾기