Linux/Python学习论坛-京峰教育

 找回密码
 立即注册

一键登录:

搜索
热搜: 活动 交友 discuz
查看: 680|回复: 1

最新版:日志切割、打包、FTP上传与自动补传等功能

[复制链接]

22

主题

69

帖子

1673

积分

金牌会员

Rank: 6Rank: 6

积分
1673
发表于 2016-1-29 12:45:09 | 显示全部楼层 |阅读模式

crontab部署示例:

2 * * * * /root/train_service/gateway_backup_and_upload_gm.sh -f /var/log/host/gmgw.log -t tar -h SDGM-TS-GM-WIN >> /var/log/cron_scripts_run.log  2>&1  &
1 * * * * /root/train_service/gateway_backup_and_upload_cl.sh -f /var/log/host/clgw.log -t tar -h SDCL-TS-CL-WIN >> /var/log/cron_scripts_run.log  2>&1  &
0 * * * * /root/train_service/aclog_backup_and_upload.sh -f /var/log/host/ac.log >> /var/log/cron_scripts_run.log  2>&1  &

--------------------------
  1. #!/bin/bash
  2. #Cut and upload gateway log
  3. #by colin
  4. #revision on 2016-01-21
  5. ########################################
  6. #功能说明:该脚本运用于上传gateway日志
  7. #
  8. #使用说明:
  9. #./gateway_backup_and_upload.sh -f /var/log/host/qfgw.log -t tar -h SDQD-TS-CL-WIN
  10. #更新说明:
  11. #
  12. ########################################
  13. #sleep 60            #延时60秒运行
  14. PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  15. RUN_LOG='/var/log/cron_scripts_run.log'
  16. [ ! -f ${RUN_LOG} ] && touch ${RUN_LOG}

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

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

  24. echoGoodLog "Now, Script: `basename $0` run."

  25. cleanRunLog(){
  26.     CLEANLOGFILE=${1?"Usage: $FUNCNAME log_file_name"}
  27.     TEMP_WC=`cat ${CLEANLOGFILE} |wc -l`
  28.     [ "${TEMP_WC}" -gt 100000 ] && {
  29.         sed -i "1,5000d" ${CLEANLOGFILE}
  30.         [ $? -eq 0 ] && echoGoodLog "Clean up the ${CLEANLOGFILE}..."
  31.     }
  32.     echoGoodLog "Script: `basename $0` run done."
  33.     exit
  34. }

  35. #省份数组
  36. PROVINCE=(
  37.     sd
  38.     hlj
  39.     sc
  40. )

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

  62. checkParameter(){
  63.     PARAMETER=${1:-'null'}
  64.     PARAMETER_STATUS=`echo "${PARAMETER}" |grep "^-"|wc -l`
  65.     if [ ${PARAMETER_STATUS} -eq 1 -o "${PARAMETER}" = "null" ];then
  66.         scriptsHelp
  67.         echoBadLog "参数错误,请重新输入。"
  68.         exit
  69.     fi
  70. }

  71. #判断是否带参数
  72. if [ -z "$*" ];then
  73.    scriptsHelp
  74.    exit
  75. else
  76.     #脚本传参数,调用相应的函数功能
  77.     while test -n "$1";do
  78.         case "$1" in
  79.             --file|-f)
  80.                 shift
  81.                 checkParameter $1
  82.                 LOG_NAME=$1
  83.                 ;;
  84.             --tar|-t)
  85.                 shift
  86.                 checkParameter $1
  87.                 CTAR=$1
  88.                 ;;
  89.             --hostname|-h)
  90.                 shift
  91.                 checkParameter $1
  92.                 CHOSTNAME=$1
  93.                 ;;
  94.             -c)
  95.                 CCHECK_LOG_SERVER_DIR=$1
  96.                 ;;
  97.             *)
  98.                 echoBadLog "Unknown argument: $1"
  99.                 scriptsHelp
  100.                 exit
  101.                 ;;
  102.         esac
  103.         shift
  104.     done
  105. fi

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

  114. #############################
  115. #define the ftp client
  116. LOG_TYPE="gateway"
  117. LOG_TYPEB="eglog"
  118. LCD_DIR="/data/${STATION}_log/${STATION}_${LOG_TYPE}"
  119. #日志服务器上的保存文件夹特例
  120. #----------------------------
  121. case ${STATION_SITE}${STATION_TYPE} in
  122.     sdbs) CD_DIR="/${LOG_TYPEB}/${STATION_SITE}/qdjy/${STATION}/";;
  123.     *) CD_DIR="/${LOG_TYPEB}/${STATION_SITE}/${STATION}/";;
  124. esac
  125. #############################
  126. #define the ftp server
  127. FTPSERVER='116.215.11.72'
  128. FTPUSER='upload'
  129. FTPPASSWD='1111111'
  130. SSHPORT='8989'
  131. #############################

  132. T=`echo $(date +%k) |sed 's/ //g'`
  133. LAST_T=`echo $(date -d "1 hour ago" +%k) |sed 's/ //g'`
  134. DAY_TIME=`date +%Y-%m-%d`
  135. LAST_DAY_TIME=`date -d "yesterday" +%Y-%m-%d`
  136. LAST_HOUR_TIME=`date -d "1 hour ago" +%Y-%m-%d-%H`
  137. LOG_HOUR_NAME="${LOG_TYPE}${LAST_HOUR_TIME}.txt"
  138. LOG_DAY_NAME="${LOG_TYPE}${LAST_DAY_TIME}.txt"
  139. case "${IS_TAR}" in
  140.     "tar")
  141.         PUT_LOG_DAY_NAME="${LOG_DAY_NAME%.txt}.tar.gz"
  142.         PUT_LOG_HOUR_NAME="${LOG_HOUR_NAME%.txt}.tar.gz"
  143.         ;;
  144.     "notar")
  145.         PUT_LOG_DAY_NAME="${LOG_DAY_NAME}"
  146.         PUT_LOG_HOUR_NAME="${LOG_HOUR_NAME}"
  147.         ;;
  148. esac

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

  159. checkProgramExist(){
  160.     PROGRAMNAME=${1?"Usage: $FUNCNAME program_install_name"}
  161.     PROGRAMEXIST=`dpkg -l |grep -wo ${PROGRAMNAME}|wc -l`
  162.     if [ ${PROGRAMEXIST} -ge 1 ];then
  163.         return 0;
  164.     else
  165.         /usr/bin/apt-get install ${PROGRAMNAME} -y        
  166.         if [ $? -eq 0 ];then
  167.             echoGoodLog "Install ${PROGRAMNAME} is successfully."
  168.             return 0;
  169.         else
  170.             echoBadLog "Install ${PROGRAMNAME} was failed, Please check..."
  171.             return 1;
  172.         fi
  173.     fi
  174. }

  175. checkLogServerDir(){
  176.     checkProgramExist expect
  177.     passwd=${FTPPASSWD}
  178.     /usr/bin/expect <<-EOF
  179. set time 1
  180. spawn ssh -p${SSHPORT} ${FTPUSER}@${FTPSERVER}
  181. expect {
  182.     "*yes/no" { send "yes\r"; exp_continue }
  183.     "*password:" { send "$passwd\r" }
  184. }
  185. expect "*~$"
  186. send "cd /home/upload${CD_DIR}\r"
  187. expect {
  188.     "*No such file or directory" { send "mkdir -p /home/upload${CD_DIR}\r" }
  189. }
  190. expect "*~$"
  191. send "exit\r"
  192. interact
  193. expect eof
  194. EOF
  195.     echo -e "\r"
  196. }

  197. [ ! -d ${LCD_DIR} ] && mkdir -p ${LCD_DIR}
  198. #若切割后的日志文件存在时,就退出切割命令等
  199. cd ${LCD_DIR} && [ -f ${PUT_LOG_HOUR_NAME} ] || {
  200.     if [ -s ${LOG_NAME} ];then
  201.         until [ -f ${LOG_HOUR_NAME} ]
  202.         do
  203.             cp ${LOG_NAME} ${LOG_HOUR_NAME}
  204.         done
  205.         if [ $? -eq 0 ] && [ -f "${LOG_HOUR_NAME}" ];then
  206.             echoGoodLog "Create ${LOG_HOUR_NAME} is successfully."
  207.         else
  208.             echoBadLog "Create ${LOG_HOUR_NAME} was failed, Please check..."
  209.         fi
  210.         [ "${IS_TAR}" = "tar" ] && tarLogFile ${PUT_LOG_HOUR_NAME} ${LOG_HOUR_NAME}        
  211.         if [ "${T}" -eq 0 ];then
  212.             TEMP_CHECK_LOG=`ls -l ${LOG_DAY_NAME} |awk '{print $5}'`
  213.             cat ${LOG_NAME} >> ${LOG_DAY_NAME}
  214.             [ $? -eq 0 ] || cat ${LOG_NAME} >> ${LOG_DAY_NAME}
  215.             CHECK_LOG=`ls -l ${LOG_DAY_NAME} |awk '{print $5}'`
  216.         else
  217.             [ -f ${LOG_TYPE}${DAY_TIME}.txt ] || touch ${LOG_TYPE}${DAY_TIME}.txt
  218.             TEMP_CHECK_LOG=`ls -l ${LOG_TYPE}${DAY_TIME}.txt |awk '{print $5}'`
  219.             cat ${LOG_NAME} >> ${LOG_TYPE}${DAY_TIME}.txt
  220.             [ $? -eq 0 ] || cat ${LOG_NAME} >> ${LOG_TYPE}${DAY_TIME}.txt
  221.             CHECK_LOG=`ls -l ${LOG_TYPE}${DAY_TIME}.txt |awk '{print $5}'`
  222.         fi
  223.         echoGoodLog "CHECK: CHECK_LOG=${CHECK_LOG},TEMP_CHECK_LOG=${TEMP_CHECK_LOG}..."
  224.         if [ "${CHECK_LOG}" -gt "${TEMP_CHECK_LOG}" ];then
  225.             cat /dev/null > ${LOG_NAME}
  226.             [ $? -eq 0 ] && echoGoodLog "Append: ${LOG_HOUR_NAME} to ${LOG_TYPE}_day_log is successfully."
  227.         else
  228.             echoBadLog "Append: ${LOG_HOUR_NAME} to ${LOG_TYPE}_day_log was failed, Please check..."
  229.         fi
  230.         [ "${T}" -eq 0 -a "${IS_TAR}" = "tar" ] && tarLogFile ${PUT_LOG_DAY_NAME} ${LOG_DAY_NAME}
  231.     else
  232.         echoBadLog "Log: ${LOG_NAME} is null or not exist, Please check..."
  233.     fi
  234. }

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

  241. #FTP自动化上传函数
  242. sendLog(){
  243.     SENDLOGFILE=$1
  244.         ftp -ivn ${FTPSERVER} 21 >${FTP_ERROR_LOG} << _EOF_
  245.         user ${FTPUSER} ${FTPPASSWD}
  246.         passive
  247.         bin
  248.         lcd ${LCD_DIR}
  249.         cd  ${CD_DIR}
  250.         put ${SENDLOGFILE}
  251.         bye
  252. _EOF_
  253.     #统计前面FTP运行输出的错误日志记录行数
  254.     LOG_COUNT=`grep "^226" ${FTP_ERROR_LOG}|wc -l`
  255.     if [ ${LOG_COUNT} -eq 1 ];then
  256.         echoGoodLog "Send: ${SENDLOGFILE} to ftp_server was successfully."
  257.         return 0
  258.     else
  259.         echoBadLog "Send: ${SENDLOGFILE} more than $x time."
  260.         sleep 30
  261.         return 1
  262.     fi
  263. }

  264. REUPLOADLIST="/var/log/re_upload_list_${STATION}.log"
  265. TEMP_REUPLOADLIST="/var/log/temp_re_upload_list_${STATION}.log"
  266. [ -f ${TEMP_REUPLOADLIST} ] && rm ${TEMP_REUPLOADLIST}
  267. runSendLog(){
  268.     SENDLOGNAME=$1
  269.     x=1;i=1
  270.     until [ "$i" -eq 0 ];do
  271.         [ $x -gt 6 ] && {
  272.             echoBadLog "Send: ${SENDLOGNAME} to ftp_server was failed, Please check..."
  273.             echo "${LCD_DIR};;${CD_DIR};;${SENDLOGFILE}" >> ${TEMP_REUPLOADLIST}
  274.             break
  275.         }
  276.         sendLog "${SENDLOGNAME}"
  277.         i=`echo $?`
  278.         x=`expr $x + 1`
  279.     done
  280. }

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

  283. #重传上次发送失败的文件
  284. reUploadFile(){
  285.     TEMP_NEED_DO_FILE=$1
  286.     REUPLOADLIST_NUM=`cat ${TEMP_NEED_DO_FILE}|wc -l`
  287.     [ ${REUPLOADLIST_NUM} -ge 1 ] && {
  288.         while read line
  289.         do
  290.             LCD_DIR=`echo ${line}|awk -F";;" '{print $1}'`
  291.             CD_DIR=`echo ${line}|awk -F";;" '{print $2}'`
  292.             REUPLOADFILENAME=`echo ${line}|awk -F";;" '{print $3}'`
  293.             [ -f "${LCD_DIR}/${REUPLOADFILENAME}" ] && runSendLog ${REUPLOADFILENAME}
  294.         done < ${TEMP_NEED_DO_FILE}
  295.     }
  296. }

  297. [ -s ${REUPLOADLIST} ] && reUploadFile ${REUPLOADLIST}
  298. [ -f ${TEMP_REUPLOADLIST} ] && mv ${TEMP_REUPLOADLIST} ${REUPLOADLIST}
  299. [ -f ${FTP_ERROR_LOG} ] && rm ${FTP_ERROR_LOG}
  300. #清理超过90天的备份日志
  301. [ -d ${LCD_DIR} ] && cd ${LCD_DIR} && {
  302.     for FILENAME in `find . -type f -ctime +180 | awk -F/ '{print $2}'`
  303.     do
  304.         rm  ${FILENAME}
  305.         [ $? -eq 0 ] && echoGoodLog "Clear: ${LCD_DIR}/${FILENAME}..."
  306.     done
  307. }
  308. cleanRunLog ${RUN_LOG}
复制代码



--------------------------
回复

使用道具 举报

22

主题

69

帖子

1673

积分

金牌会员

Rank: 6Rank: 6

积分
1673
 楼主| 发表于 2016-1-29 15:30:29 | 显示全部楼层
在315行与316行之间,添加如下语句,清理处理过的文件
    [ -e ${TEMP_NEED_DO_FILE} ] && rm ${TEMP_NEED_DO_FILE}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|京峰教育,只为有梦想的人 ( 京ICP备15013173号 )

GMT+8, 2017-7-25 04:36 , Processed in 0.053396 second(s), 18 queries , Apc On.

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