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

 找回密码
 立即注册

一键登录:

搜索
热搜: 活动 交友 discuz
查看: 925|回复: 0

生产环境中,检测日志文件是否上传到日志服务器,干货...

[复制链接]

22

主题

69

帖子

2129

积分

金牌会员

Rank: 6Rank: 6

积分
2129
发表于 2015-6-27 05:23:30 | 显示全部楼层 |阅读模式

检测日志文件是否上传到到日志服务器
目前的生产环境中,即将要使用的脚本,欢迎大家拍砖……
  1. #!/bin/bash
  2. #Auto check log files and notice by email
  3. #By colin on 2015-06-25

  4. #定义数组EMAIL:收取报警邮件的EMAIL地址
  5. EMAIL=(
  6.         11111@11111.cn
  7. )

  8. #定义数组DIR_LIST:指定需要检测的根目录
  9. DIR_LIST=(
  10.         /data
  11. )

  12. #设置检测时间间隔
  13. check_interval=3600
  14. check_interval_hour=1

  15. #定义邮件报警文件与运行日志文件变量
  16. TEMP_EMAIL_FILES='/tmp/temp_email_files.txt'
  17. RUN_LOG='/var/log/check_log_run_stats.log'
  18. TEMP_DIR_FILES='/tmp/temp_check_log_dir_list.txt'

  19. #创建脚本运行日志文件
  20. [ ! -f ${RUN_LOG} ] && touch ${RUN_LOG}

  21. #初始化邮件报警内容头文件
  22. [ ! -f ${TEMP_EMAIL_FILES} ] && touch ${TEMP_EMAIL_FILES} && {
  23.     cat >${TEMP_EMAIL_FILES} <<EOF

  24. ************ 上传日志文件失败的站点清单 ************

  25. EOF
  26. }

  27. #取得系统当前时间
  28. NOW_TIME=`date +%F" "%T`
  29. sys_time=`date -d "${NOW_TIME}" +%s`

  30. #函数check_log功能说明
  31. #检查时间间隔内,是否有最新日志文件
  32. #若没有新日志文件,就追加报警记录
  33. check_log(){
  34. [ ! -f ${TEMP_EMAIL_FILES} ] && touch ${TEMP_EMAIL_FILES}
  35. #取得目录下最新文件的时间戳
  36. #LAST_FILE_TIME=`ls --full-time -lt |head -2|sed -n 2p |awk '{print $6,$7}'|awk -F. '{print $1}'`
  37. LAST_FILE_TIME=`ls --full-time -lt |tail -1 |awk '{print $6,$7}'|awk -F. '{print $1}'`

  38. #把上面取得的时间转化成秒值
  39. file_time=`date -d "${LAST_FILE_TIME}" +%s`

  40. #获取两者时间间隔差值
  41. interval=`expr ${sys_time} - ${file_time}`
  42. interval_hour=`expr ${interval} / ${check_interval}`

  43. [ ${interval_hour} -ge ${check_interval_hour} ] && {
  44.         cat >>${TEMP_EMAIL_FILES} <<EOF
  45. 在 ${LAST_FILE_TIME} 与 ${NOW_TIME} 期间,目录 $1 没有上传新的日志文件,请检查错误!
  46. EOF
  47. }
  48. }

  49. #代码重用
  50. call_chek_log(){
  51.         [ $x -eq 3 ] && x=1 || i=`expr $x + 1`
  52.     check_log $1;   # 调用函数check_log
  53.     echo "`date +%F" "%T` $x time, The ${DIR} over ${interval_hour} hour did not create a new log file ..." >> ${RUN_LOG}
  54. }

  55. #echo "${NOW_TIME} The ${DIR} is't exists, Please check the dir_list.txt ..." >> ${RUN_LOG}

  56. #函数check_dir功能说明
  57. #变量x是发送邮件的次数,一个小时内只发送三次
  58. #变量LOG_INTERVAL是最后一条已发送邮件的时间戳
  59. #这里通过时间戳与发送次数来进行双重判断
  60. #调用call_chek_log函数,call_chek_log函数调用chek_log
  61. check_dir(){
  62.         DIR=$1
  63.     LAST_LOG_TIME=`tail -100 ${RUN_LOG} |grep ${DIR} |tail -1|awk '''{print $1" "$2}'''`
  64.     log_time=`date -d "${LAST_LOG_TIME}" +%s`
  65.     LOG_INTERVAL=`expr ${sys_time} - ${log_time}`
  66.     x=`tail -100 ${RUN_LOG} |grep ${DIR} |tail -1|awk '{print $3}'`
  67.     [ -z $x ] && x=0
  68.         cd ${DIR}
  69.     if [ "${LOG_INTERVAL}" -ge ${check_interval} ];then
  70.         call_chek_log ${DIR}
  71.     else
  72.         [ "$x" -lt 3 ] && call_chek_log ${DIR}
  73.     fi
  74. }

  75. #函数loop_dir功能说明
  76. #使用方法:loop_dir /data
  77. #遍历传递过来的参数下的所有目录,并递归调用
  78. loop_dir(){
  79. for i in $1/*
  80. do
  81.         if [ -d $i ];then
  82.                 echo $i >>${TEMP_DIR_FILES}
  83.                 loop_dir $i                #调用loop_dir
  84.         fi
  85. done
  86. }

  87. #检测脚本是否有参数
  88. #有参数,就检测指定的目录
  89. #无参数,就检测定义的目录数组DIR_LIST
  90. if [ -z "$*" ];then
  91.         for i in ${DIR_LIST[@]}
  92.     do
  93.                 echo $i >>${TEMP_DIR_FILES}
  94.                 loop_dir $i
  95.     done
  96. else
  97.         for i in $*
  98.         do
  99.                 [ -d $i ] && {
  100.                         echo $i >>${TEMP_DIR_FILES};loop_dir $i
  101. }|| echo "`date +%F" "%T` The $i is't a directory, Please check the arguments ..." >> ${RUN_LOG}
  102.         done
  103. fi

  104. #循环检测临时文件列表
  105. [ -f ${TEMP_EMAIL_FILES} ] && {
  106. while read line
  107. do
  108.         check_dir $line
  109. done < ${TEMP_DIR_FILES}
  110. }


  111. #循环邮件数组清单,发出报警通知
  112. [ `cat ${TEMP_EMAIL_FILES}|wc -l` -eq 3 ] || {
  113. for i in ${EMAIL[@]}
  114. do
  115.         dos2unix -k ${TEMP_EMAIL_FILES}
  116.         mail -s "THE LOG Is NOT EXISTS" ${i} < ${TEMP_EMAIL_FILES}
  117.         echo "`date +%F" "%T` And send email to ${i}, Please check ..." >> ${RUN_LOG}
  118. done
  119. }

  120. #清除旧的邮件报警内容
  121. [ -f ${TEMP_EMAIL_FILES} ] && rm -rf ${TEMP_EMAIL_FILES}
  122. [ -f ${TEMP_DIR_FILES} ] && rm -rf ${TEMP_DIR_FILES}
复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2019-1-20 17:32 , Processed in 0.022257 second(s), 14 queries , Apc On.

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