一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

linux下check_logs日志轮询检测异常脚本

时间:2015-08-22 编辑:简简单单 来源:一聚教程网

文件目录结构如下

 

contacts_list文件

里面是填写你的邮件地址的

global_profile

 代码如下 复制代码

#!/bin/bash
PRG="$0"
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
BASEDIR=`dirname "$PRG"`
#写入当前服务器的IP地址用于邮件触发是区别异常服务器
SERVER_IP="192.168.10.100"
TIME=$(date +%Y-%m-%d)
LOG_DIR=$BASEDIR/logs
MAKE_LOG_FILE=log.$1.$TIME
#需要检测或轮询的日志文件列表
LOG_FILE_LIST=$BASEDIR/logs_list
#邮件联系人列表文件
MAILX_CONTACTS_LIST=$BASEDIR/contacts_list
#mailx发邮件程序的路径
MAILX_BIN=/usr/src/mailx-12.4/mailx
#邮件标题内容
MAILX_TITLE="$SERVER_IP日志检测异常提醒"


logs_list文件内容如下

#日志路径已经日志文件前缀(注意写不包含日期的部分,如果日志有时间的话将最后一列设置为1默认会自动添加日期) 服务名称 间隔时间 查找内容 开启或关闭邮件 打开或关闭日志格式,日志格式为(0表示采用默认指定格式,1表示采用所有格式*-日期、*-日期.log、*_日期、*_日期.log、*.日期、*.日期.log等)

 代码如下 复制代码
/var/log/secure secure 10 failed 1 0
/var/log/log kkk 20 failed 0 1
/var/log/a sss 5 failed 0 1
/var/log/b bbb 5 failed 0 1


commands.sh文件如下

 代码如下 复制代码

#!/bin/bash
PRG="$0"
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
BASEDIR=`dirname "$PRG"`
PID_DIR=/var/run
source $BASEDIR/global_profile
if [ $# -eq 0 ];then
 echo "$(date)|请使用startup.sh脚本启动服务,如果需要手动触发该脚本请传递一个服务名称`cat $LOG_FILE_LIST|grep -v "^#"|grep -v "^$"|awk '{print $2}'|xargs`其中一个."
 exit 0
elif [ $# -eq 1 ];then
 if [ ! -e $LOG_FILE_LIST ]||[ ! -s $LOG_FILE_LIST ];then
        echo "$(date)|当前日志文件列表($LOG_FILE_LIST)不存在或者为空,检测失败,程序退出."
        exit 0
 else
        WC_LOG_FILE_LIST=`cat $LOG_FILE_LIST|awk '{print $2}'|egrep -o $1|wc -l`
        if [ $WC_LOG_FILE_LIST -eq 0 ];then
            echo "$(date)|请传递指定列表`cat $LOG_FILE_LIST|awk '{print $2}'|xargs`的日志服务名称."
            exit 0
  fi
 fi
else
 echo "$(date)|这里只接受传递一级参数服务名称,请确认后重新传."
 exit 0
fi
while 1>0;do
if [ ! -e $BASEDIR/global_profile ]||[ ! -s $BASEDIR/global_profile ];then
 echo "$(date)|当前变量文件($BASEDIR/global_profile)不存在或者为空,程序异常退出."
 break
else
source $BASEDIR/global_profile
TIME=$(date +%Y-%m-%d)
TIME1=$(date +%Y%m%d)
LOG_DIR=$BASEDIR/logs
MAKE_LOG_FILE=log.$1.$TIME
if [ ! -e $LOG_DIR ];then
 mkdir -p $LOG_DIR
fi
if [ -e $LOG_FILE_LIST ];then
 if [ -s $LOG_FILE_LIST ];then
  SLEEP_TIME=`grep "$1" $LOG_FILE_LIST|awk '{print $3}'|grep -v "^#"|grep -v "^$"`
  GREP_CONTENTS=`grep "$1" $LOG_FILE_LIST|awk '{print $4}'|grep -v "^#"|grep -v "^$"`
  OPEN_CLOSE_SEND_MAIL=`grep "$1" $LOG_FILE_LIST|awk '{print $5}'|grep -v "^#"|grep -v "^$"`
  OPEN_CLOSE_LOGS_DAY=`grep "$1" $LOG_FILE_LIST|awk '{print $6}'|grep -v "^#"|grep -v "^$"`
  if [ $OPEN_CLOSE_LOGS_DAY -eq 0 ];then
   CHECK_LOG_FILE=`grep "$1" $LOG_FILE_LIST|awk '{print $1}'|grep -v "^#"|grep -v "^$"`
  elif [ $OPEN_CLOSE_LOGS_DAY -eq 1 ];then
   TEMP_CHECK_LOG_FILE=`grep "$1" $LOG_FILE_LIST|awk '{print $1}'|grep -v "^#"|grep -v "^$"`
   #以下是匹配所有日志格式的语句
   if [ -e ${TEMP_CHECK_LOG_FILE}.${TIME} ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME}
   elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME} ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME}
   elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME} ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME}
   elif [ -e ${TEMP_CHECK_LOG_FILE}.${TIME}.log ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME}.log
   elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME}.log ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME}.log
   elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME}.log ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME}.log
   elif [ -e ${TEMP_CHECK_LOG_FILE}.${TIME1} ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME1}
   elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME1} ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME1}
   elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME1} ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME1}
   elif [ -e ${TEMP_CHECK_LOG_FILE}.${TIME1}.log ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME1}.log
   elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME1}.log ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME1}.log
   elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME1}.log ];then
    CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME1}.log
   else
    echo "$(date)|未知的日志格式."|tee -a $LOG_DIR/$MAKE_LOG_FILE
   fi
  else
   echo "$(date)|当前传递参数错误,请传递0或者1(0表示使用当前日志查找或者1自动添加当前日期查找)"|tee -a $LOG_DIR/$MAKE_LOG_FILE
  fi
  WC_COUNT_LOG_START=`wc -l $CHECK_LOG_FILE|awk '{print $1}'`
  sleep $SLEEP_TIME
  WC_COUNT_LOG_START1=`wc -l $CHECK_LOG_FILE|awk '{print $1}'`
  WC_UPDATE_LOG_FILE=`expr $WC_COUNT_LOG_START1 - $WC_COUNT_LOG_START`
  if [ $WC_UPDATE_LOG_FILE -eq 0 ];then
   echo "$(date)|当前检测日志($CHECK_LOG_FILE)没有日志更新." >>$LOG_DIR/$MAKE_LOG_FILE
  else
   WC_GREP_COUNTS=`tail -"$WC_UPDATE_LOG_FILE" "$CHECK_LOG_FILE"|grep "$GREP_CONTENTS"|wc -l`
   if [ $WC_GREP_COUNTS -eq 0 ];then
    echo "$(date)|当前更新的日志($CHECK_LOG_FILE)没有发现指定查找内容($GREP_CONTENTS)." >>$LOG_DIR/$MAKE_LOG_FILE
   else
    if [ $OPEN_CLOSE_SEND_MAIL -eq 1 ];then
     if [ -e $MAILX_CONTACTS_LIST ];then
      if [ -s $MAILX_CONTACTS_LIST ];then
       echo "当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS)."|$MAILX_BIN -s "$MAILX_TITLE" `cat $MAILX_CONTACTS_LIST|grep -v "^#"|grep -v "^$"|xargs`
       echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),已触发邮件通知`cat $MAILX_CONTACTS_LIST|grep -v "^#"|grep -v "^$"|xargs`."
      else
       echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),邮件联系人列表文件($MAILX_CONTACTS_LIST)为空,触发邮件失败." >>$LOG_DIR/$MAKE_LOG_FILE
      fi
     else
      echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),联系人列表文件($MAILX_CONTACTS_LIST)不存在,触发邮件失败." >>$LOG_DIR/$MAKE_LOG_FILE
     fi
    else
     echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),当前设置为禁止发送邮件." >>$LOG_DIR/$MAKE_LOG_FILE
    fi
   fi
  fi

 else
  echo "$(date)|当前日志文件列表($LOG_FILE_LIST)为空,程序退出执行." >>$LOG_DIR/$MAKE_LOG_FILE    
  break
 fi
else
 echo "$(date)|当前日志文件列表($LOG_FILE_LIST)不存在,程序退出执行." >>$LOG_DIR/$MAKE_LOG_FILE
 break
fi
fi
done


startup.sh文件如下所示

 代码如下 复制代码

#!/bin/bash
PRG="$0"
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
BASEDIR=`dirname "$PRG"`
PID_DIR=/var/run
#用于检测全局变量文件是否存在或者为空,如果不存在或为空则退出程序
if [ ! -e $BASEDIR/global_profile ]||[ ! -s $BASEDIR/global_profile ];then
 echo "$(date)|当前全局变量文件($BASEDIR/global_profile)不存在或者没有内容,检测失败,程序退出."
 exit 0
else
 source $BASEDIR/global_profile
fi
#用于检测日志列表文件是否存在或为空,如果不存在或者为空则退出程序
if [ ! -e $LOG_FILE_LIST ]||[ ! -s $LOG_FILE_LIST ];then
 echo "$(date)|当前日志文件列表($LOG_FILE_LIST)不存在或者为空,检测失败,程序退出."
 exit 0
else
 WC_LOG_FILE_LIST=`cat $LOG_FILE_LIST|awk '{print $2}'|egrep -o $1|wc -l`
 if [ $WC_LOG_FILE_LIST -eq 0 ];then
  echo "$(date)|请传递指定列表`cat $LOG_FILE_LIST|awk '{print $2}'|xargs`的日志服务名称."
  exit 0
 else
 if [ $# -eq 1 ];then
  if [ -e $PID_DIR/$1.pid ];then
   echo "$(date)|当前进程PID文件($PID_DIR/$1.pid)已经存在,启动服务失败."
   exit 0
  else
   $BASEDIR/commands.sh $1 &
   echo $! >$PID_DIR/$1.pid
   echo "$(date)|当前启动进程ID为`cat $PID_DIR/$1.pid`"
  fi
 elif [ $# -eq 2 ];then
  if [ -e $PID_DIR/$1.pid ];then
   if [ -s $PID_DIR/$1.pid ];then
    if [ $2 == 'start' ];then
     echo "$(date)|进程PID文件($PID_DIR/$1.pid)已存在再次启动失败."
     exit 0
    elif [ $2 == 'stop' ];then
     echo "$(date)|正在停止($1)服务,当前停止进程为`cat $PID_DIR/$1.pid`"
     cat $PID_DIR/$1.pid|xargs kill -9 &>/dev/null
     /bin/rm -f $PID_DIR/$1.pid &>/dev/null
    elif [ $2 == 'status' ];then
     echo "$(date)|服务($1)正在运行,当前进程ID为`cat $PID_DIR/$1.pid`"
    else
     echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态."
     exit 0
    fi
   else
    if [ $2 == 'start' ];then
     echo "$(date)|进程PID文件($PID_DIR/$1.pid)已存但是为空在再次启动失败."
     exit 0
    elif [ $2 == 'stop' ];then
     echo "$(date)|当前进程PID文件为空,停止进程失败."
     exit 0
    elif [ $2 == 'status' ];then
     echo "$(date)|当前进程PID文件为空,无法获知服务状态."
     exit 0
    else
     echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态."
     exit 0
    fi
   fi
  else
                if [ $2 == 'start' ];then
                 $BASEDIR/commands.sh $1 &
                 echo $! >$PID_DIR/$1.pid
                 echo "$(date)|当前启动进程ID为`cat $PID_DIR/$1.pid`"
    elif [ $2 == 'stop' ];then
     echo "$(date)|当前进程PID文件($PID_DIR/$1.pid)不存在,停止服务失败."
     exit 0
    elif [ $2 == 'status' ];then
     echo "$(date)|当前服务($1)未启动运行."
     exit 0
    else
     echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态."
     exit 0
    fi
  fi
 else
  echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态."
  exit 0
 fi
fi
fi

热门栏目