设为首页 收藏本站
查看: 998|回复: 0

shell脚本:日志切割与上传

[复制链接]

尚未签到

发表于 2018-8-27 13:11:46 | 显示全部楼层 |阅读模式
#!/bin/bash  
# Cut and upload aclog log
  
# by colin
  
# revision on 2016-06-15
  
########################################
  
# 功能说明:该脚本运用于上传aclog日志
  
#
  
# 使用说明:
  
#+ ./aclog_backup_and_upload.sh -f /var/log/host/jnxac.log -t tar -h SDQD-TS-JNX-HLS
  
# 更新说明:
  
#
  
########################################
  
#sleep 60    #延时60秒运行
  
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  
RUN_LOG='/var/log/cron_scripts_run.log'
  
[ ! -f ${RUN_LOG} ] && touch ${RUN_LOG}
  

  
echoGoodLog(){
  
    echo -e "\033[32m`date +%F" "%T":"%N` $*\033[0m" >> ${RUN_LOG}
  
}
  

  
echoBadLog(){
  
    echo -e "\033[31m`date +%F" "%T":"%N` $*\033[0m" >> ${RUN_LOG}
  
}
  

  
echoGoodLog "Now, Script: `basename $0` run."
  
RUNLOG_MAX_NUM=100000
  
RUNLOG_MAX_DELNUM=5000
  
SEND_MAX_TIME=6
  
SEND_WHILE_SLEEP_TIME=30
  
BACK_SAVE_MAX_DAY=180
  
LOG_CUT_MIN=60   # 日志文件30分钟切割一次
  

  
cleanRunLog(){
  
    CLEANLOGFILE=${1?"Usage: $FUNCNAME log_file_name"}
  
    TEMP_WC=`cat ${CLEANLOGFILE} |wc -l`
  
    [ "${TEMP_WC}" -gt "${RUNLOG_MAX_NUM}" ] && {
  
        sed -i "1,${RUNLOG_MAX_DELNUM}d" ${CLEANLOGFILE} && echoGoodLog "Clean up the ${CLEANLOGFILE}..."
  
    }
  
    echoGoodLog "Script: `basename $0` run done."
  
    exit
  
}
  

  
##
  
# 省份数组
  
#
  
PROVINCE=(
  
    sd
  
    hlj
  
    sc
  
)
  

  
##
  
# 脚本帮助提示函数
  
#
  
scriptsHelp(){
  
    echoBadLog "======================================="
  
    echoGoodLog "Usage parameters:"
  
    echoGoodLog "./`basename $0` -f/--file /var/log/host/qfgw.log [-t/--tar tar] [-h/--hostname SDQD-TS-CL-WIN]"
  
    echoGoodLog "Options:"
  
        echoGoodLog " -f/--file)"
  
        echoGoodLog "    必须的参数:需要切割与上传的日志文件"
  
        echoGoodLog " -t/--tar)"
  
        echoGoodLog "    可选参数:若需打包,使用方法: -t tar "
  
        echoGoodLog " -h/--hostname)"
  
        echoGoodLog "    可选参数:若一个站点存放了多个地方的相同类型日志,此时就需要设定每个日志所属站点"
  
        echoGoodLog "        比如:昌乐的网关日志,没有HLS,日志存储在青岛北,那加参数如下:-h SDQD-TS-CL-WIN"
  
        echoGoodLog " -c)"
  
        echoGoodLog "    可选参数:用于检查日志服务器上是否有存储日志的文件夹,没有就创建,需使用except命令,会自动安装"
  
        echoGoodLog "        注意:日志服务器必须要开放ssh远程登录,或者防火墙需要放行"
  
        echoGoodLog "        使用方法:./`basename $0` -c   ;-c后面不需要加选项"
  
    echoGoodLog "Example:"
  
    echoGoodLog "./`basename $0` -f /var/log/host/qfgw.log -t tar -h SDQD-TS-CL-WIN"
  
    echoBadLog "======================================="
  
}
  

  
checkParameter(){
  
    PARAMETER=${1:-null}
  
    PARAMETER_STATUS=`echo "${PARAMETER}" |grep "^-"|wc -l`
  
    if [ "${PARAMETER_STATUS}" -eq 1 -o "${PARAMETER}" = "null" ];then
  
        scriptsHelp
  
        echoBadLog "参数错误,请重新输入。"
  
        exit
  
    fi
  
}
  

  
##
  
# 判断是否带参数
  
#
  
if [ -z "$*" ];then
  
   scriptsHelp
  
   exit
  
else
  
    ##
  
    # 脚本传参数,调用相应的函数功能
  
    #
  
    while test -n "$1";do
  
        case "$1" in
  
            --file|-f)
  
                shift
  
                checkParameter $1
  
                LOG_NAME=$1
  
                ;;
  
            --tar|-t)
  
                shift
  
                checkParameter $1
  
                CTAR=$1
  
                ;;
  
            --hostname|-h)
  
                shift
  
                checkParameter $1
  
                CHOSTNAME=$1
  
                ;;
  
            -c)
  
                CCHECK_LOG_SERVER_DIR=$1
  
                ;;
  
            *)
  
                echoBadLog "Unknown argument: $1"
  
                scriptsHelp
  
                exit
  
                ;;
  
        esac
  
        shift
  
    done
  
fi
  

  
##
  
# 需要切割的日志为必须要的参数
  
#
  
checkParameter $LOG_NAME
  
IS_TAR=${CTAR:-notar}
  
HOSTNAME=${CHOSTNAME:-`hostname`}
  
TEMP_PRO=`echo ${PROVINCE[@]} |sed "s/ /|/g"`
  
STATION=`echo ${HOSTNAME} |awk -F- '{print $3}'|tr [A-Z] [a-z]`
  
STATION_TYPE=`echo ${HOSTNAME} |awk -F- '{print $2}'|tr [A-Z] [a-z]`
  
STATION_SITE=`echo ${HOSTNAME} |awk -F- '{print $1}'|tr [A-Z] [a-z] |grep -Eo "\b${TEMP_PRO}"`
  

  
#############################
  
# define the ftp client
  
LOG_TYPE="aclog"
  
LOG_TYPEB="aclog"
  
LCD_DIR="/data/${STATION}_log/${STATION}_${LOG_TYPE}"
  
# 日志服务器上的保存文件夹特例
  
#----------------------------
  
case ${STATION_SITE}${STATION_TYPE} in
  
    #sdbs) CD_DIR="/${LOG_TYPEB}/${STATION_SITE}/qdjy/${STATION}/";;
  
    sdbs) CD_DIR="/${LOG_TYPEB}/${STATION_SITE}/qdjy/";;
  
    *) CD_DIR="/${LOG_TYPEB}/${STATION_SITE}/${STATION}/";;
  
esac
  
#############################
  
# define the ftp server
  
FTPSERVER='IP地址'
  
FTPUSER='用户名'
  
FTPPASSWD='密码'
  
SSHPORT='端口'
  
#############################
  

  
T=`echo $(date +%k) |sed 's/ //g'`
  
#LAST_T=`echo $(date -d "1 hour ago" +%k) |sed 's/ //g'`
  
DAY_TIME=`date +%Y-%m-%d`
  
LAST_DAY_TIME=`date -d "yesterday" +%Y-%m-%d`
  
LAST_HOUR_TIME=`date +%Y-%m-%d-%H`
  
FILENUM=`expr $(date +%M|sed 's/^0//g') / ${LOG_CUT_MIN}`
  
DAY_LOG_TAR_NUM="${FILENUM}"
  
[[ "${FILENUM}" -eq 0 ]] && {
  
    FILENUM=`expr 60 / ${LOG_CUT_MIN}`
  
    LAST_HOUR_TIME=`date -d "1 hour ago" +%Y-%m-%d-%H`
  
}
  

  
##
  
# 为兼容旧版本,当60分钟切割一次时,就和之前旧版本文件名一样咯
  
#
  
if [ ${LOG_CUT_MIN} -eq 60 ];then
  
    LOG_HOUR_NAME="${LOG_TYPE}${LAST_HOUR_TIME}.txt"
  
else
  
    LOG_HOUR_NAME="${LOG_TYPE}${LAST_HOUR_TIME}-${FILENUM}.txt"
  
fi
  

  
LOG_DAY_NAME="${LOG_TYPE}${LAST_DAY_TIME}.txt"
  
case "${IS_TAR}" in
  
    "tar")
  
        PUT_LOG_DAY_NAME="${LOG_DAY_NAME%.txt}.tar.gz"
  
        PUT_LOG_HOUR_NAME="${LOG_HOUR_NAME%.txt}.tar.gz"
  
        ;;
  
    "notar")
  
        PUT_LOG_DAY_NAME="${LOG_DAY_NAME}"
  
        PUT_LOG_HOUR_NAME="${LOG_HOUR_NAME}"
  
        ;;
  
esac
  

  
tarLogFile(){
  
    TARTONAME=${1?"Usage: $FUNCNAME tar_file_name need_tar_file_name"}
  
    FROMLOG=$2
  
    tar -czf ${TARTONAME} --remove-files ${FROMLOG}
  
    if [ -e ${TARTONAME} ];then
  
        echoGoodLog "Tar: ${TARTONAME} is successfully."
  
    else
  
        echoBadLog "Tar: ${TARTONAME} was failed, Please check..."
  
    fi
  
}
  

  
checkProgramExist(){
  
    PROGRAMNAME=${1?"Usage: $FUNCNAME program_install_name"}
  
    PROGRAMEXIST=`dpkg -l |grep -wo ${PROGRAMNAME}|wc -l`
  
    if [ "${PROGRAMEXIST}" -ge 1 ];then
  
        return 0;
  
    else
  
        /usr/bin/apt-get install ${PROGRAMNAME} -y
  
        if [ $? -eq 0 ];then
  
            echoGoodLog "Install ${PROGRAMNAME} is successfully."
  
            return 0;
  
        else
  
            echoBadLog "Install ${PROGRAMNAME} was failed, Please check..."
  
            return 1;
  
        fi
  
    fi
  
}
  

  
checkLogServerDir(){
  
    checkProgramExist expect
  
    passwd=${FTPPASSWD}
  
    /usr/bin/expect  ${LOG_DAY_NAME}
  
            [ $? -eq 0 ] || cat ${LOG_NAME} >> ${LOG_DAY_NAME}
  
            CHECK_LOG=`ls -l ${LOG_DAY_NAME} |awk '{print $5}'`
  
        else
  
            [ -f ${LOG_TYPE}${DAY_TIME}.txt ] || touch ${LOG_TYPE}${DAY_TIME}.txt
  
            TEMP_CHECK_LOG=`ls -l ${LOG_TYPE}${DAY_TIME}.txt |awk '{print $5}'`
  
            cat ${LOG_NAME} >> ${LOG_TYPE}${DAY_TIME}.txt
  
            [ $? -eq 0 ] || cat ${LOG_NAME} >> ${LOG_TYPE}${DAY_TIME}.txt
  
            CHECK_LOG=`ls -l ${LOG_TYPE}${DAY_TIME}.txt |awk '{print $5}'`
  
        fi
  
        echoGoodLog "CHECK: CHECK_LOG=${CHECK_LOG},TEMP_CHECK_LOG=${TEMP_CHECK_LOG}..."
  
        if [ "${CHECK_LOG}" -gt "${TEMP_CHECK_LOG}" ];then
  
            cat /dev/null > ${LOG_NAME}
  
            [ $? -eq 0 ] && echoGoodLog "Append: ${LOG_HOUR_NAME} to ${LOG_TYPE}_day_log is successfully."
  
        else
  
            echoBadLog "Append: ${LOG_HOUR_NAME} to ${LOG_TYPE}_day_log was failed, Please check..."
  
        fi
  
        [ "${T}" -eq 0 -a "${IS_TAR}" = "tar" -a "${DAY_LOG_TAR_NUM}" -eq 0 ] && tarLogFile ${PUT_LOG_DAY_NAME} ${LOG_DAY_NAME}
  
    else
  
        echoBadLog "Log: ${LOG_NAME} is null or not exist, Please check..."
  
    fi
  
}
  

  
##
  
# 检查保存文件夹目录是否存在
  
#
  
CHECK_LOG_SERVER_DIR=${CCHECK_LOG_SERVER_DIR:-"f.ck"}
  
[ "${CHECK_LOG_SERVER_DIR}" = "-c" ] && checkLogServerDir
  
FTP_LOG_DIR="/tmp/ftp_err"
  
[ -d ${FTP_LOG_DIR} ] || mkdir -p ${FTP_LOG_DIR}
  
FTP_ERROR_LOG="${FTP_LOG_DIR}/ftp_temp_${LOG_TYPE}_err$$.log"
  

  
##
  
# FTP自动化上传函数
  
#
  
sendLog(){
  
    SENDLOGFILE=$1
  
    ftp -ivn ${FTPSERVER} 21 >${FTP_ERROR_LOG} > ${TEMP_REUPLOADLIST}
  
            break
  
        }
  
        sendLog "${SENDLOGNAME}"
  
        i=`echo $?`
  
        x=`expr $x + 1`
  
    done
  
}
  

  
[ "${T}" -eq 0 -a -f "${LCD_DIR}/${PUT_LOG_DAY_NAME}" -a "${DAY_LOG_TAR_NUM}" -eq 0 ] && runSendLog ${PUT_LOG_DAY_NAME}
  
[ -f "${LCD_DIR}/${PUT_LOG_HOUR_NAME}" ] && runSendLog ${PUT_LOG_HOUR_NAME}
  

  
##
  
# 把上面两种发送成功的记录更新到这个临时文件
  
#
  
TEMP_SENDSUCCESFILE="/var/log/temp_send_succes_${LOG_TYPEB}_${STATION}.txt"
  
SENDSUCCESFILE="/var/log/send_succes_${LOG_TYPEB}_${STATION}.txt"
  
[ "${TEMP_SEND_STATUS}" -eq 0 ] && echo "${LCD_DIR};;${CD_DIR};;${SENDLOGFILE};;$(date +%s)" > ${TEMP_SENDSUCCESFILE}
  
[ -e ${SENDSUCCESFILE} ] && {
  
    LCD_DIR=`cat ${SENDSUCCESFILE}|awk -F";;" '{print $1}'`
  
    CD_DIR=`cat ${SENDSUCCESFILE}|awk -F";;" '{print $2}'`
  
    LAST_DATE_SUCCESS=`date -d @"$(cat ${SENDSUCCESFILE}|awk -F";;" '{print $4}')" +%Y-%m-%d`
  
    INTERVAL_TIME=`expr $(date +%s) - $(cat ${SENDSUCCESFILE}|awk -F";;" '{print $4}')`
  
    LAST_DAY=`echo $(date -d @"$(cat ${SENDSUCCESFILE}|awk -F";;" '{print $4}')" +%d)|sed 's/^0//g'`
  
    NOW_DAY=`echo $(date +%d)|sed 's/^0//g'`
  
    [ "${LAST_DAY}" -ne "${NOW_DAY}" -a "${INTERVAL_TIME}" -gt 7000 ] && {
  
        if [ "${IS_TAR}" = "tar" ];then
  
            cd ${LCD_DIR} && {
  
                TEMP_SEND_FILES="${LOG_TYPE}${LAST_DATE_SUCCESS}.tar.gz"
  
                [ -e ${TEMP_SEND_FILES} ] || tarLogFile ${TEMP_SEND_FILES} ${LOG_TYPE}${LAST_DATE_SUCCESS}.txt
  
            }
  
        else
  
            TEMP_SEND_FILES="${LOG_TYPE}${LAST_DATE_SUCCESS}.txt"
  
        fi
  
        runSendLog ${TEMP_SEND_FILES}
  
    }
  
    rm ${SENDSUCCESFILE}
  
}
  
[ -f ${TEMP_SENDSUCCESFILE} ] && mv ${TEMP_SENDSUCCESFILE} ${SENDSUCCESFILE}
  

  
##
  
# 重传上次发送失败的文件
  
#+ 说明:重新上传函数的执行段,最好是放在后面,因为它依赖前面的FTP发送函数生成的TEMP_REUPLOADLIST清单
  
#
  
reUploadFile(){
  
    TEMP_NEED_DO_FILE=$1
  
    REUPLOADLIST_NUM=`cat ${TEMP_NEED_DO_FILE}|wc -l`
  
    [ "${REUPLOADLIST_NUM}" -ge 1 ] && {
  
        while read line
  
        do
  
            LCD_DIR=`echo ${line}|awk -F";;" '{print $1}'`
  
            CD_DIR=`echo ${line}|awk -F";;" '{print $2}'`
  
            REUPLOADFILENAME=`echo ${line}|awk -F";;" '{print $3}'`
  
            [ -f "${LCD_DIR}/${REUPLOADFILENAME}" ] && runSendLog ${REUPLOADFILENAME}
  
        done < ${TEMP_NEED_DO_FILE}
  
    }
  
    [ -e ${TEMP_NEED_DO_FILE} ] && rm ${TEMP_NEED_DO_FILE}
  
}
  

  
[ -s ${REUPLOADLIST} ] && reUploadFile ${REUPLOADLIST}
  
[ -f ${TEMP_REUPLOADLIST} ] && mv ${TEMP_REUPLOADLIST} ${REUPLOADLIST}
  
[ -f ${FTP_ERROR_LOG} ] && rm ${FTP_ERROR_LOG}
  

  
##
  
# 清理超过90天的备份日志
  
#
  
[ -d ${LCD_DIR} ] && cd ${LCD_DIR} && {
  
    for FILENAME in `find . -type f -ctime +"${BACK_SAVE_MAX_DAY}" | awk -F/ '{print $2}'`
  
    do
  
        rm ${FILENAME} && echoGoodLog "Clear: ${LCD_DIR}/${FILENAME}..."
  
    done
  
}
  

  
cleanRunLog ${RUN_LOG}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557353-1-1.html 上篇帖子: shell脚本:收集系统和各种服务的状态信息 下篇帖子: shell脚本:nginx访问日志切割与打包上传
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表