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

文件目录结构如下

 


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

时间: 2024-10-02 06:01:02

linux下check_logs日志轮询检测异常脚本的相关文章

Linux下nginx日志每天定时切割实例

教程目的:   使用Linux系统自带的命令logrotate对Nginx日志进行切割.   Nginx安装目录:/usr/local/nginx/   Nginx日志目录:/usr/local/nginx/logs/./usr/local/nginx/logs/nginx_logs/  1.添加nginx日志切割脚本   cd  /etc/logrotate.d  #进入目录   vi   /etc/logrotate.d/nginx   #编辑脚本   /usr/local/nginx/lo

Linux系统下nginx日志每天定时切割的脚本写法_nginx

使用Linux系统自带的命令logrotate对Nginx日志进行切割. Nginx安装目录:/usr/local/nginx/ Nginx日志目录:/usr/local/nginx/logs/./usr/local/nginx/logs/nginx_logs/ 1.添加nginx日志切割脚本 cd /etc/logrotate.d #进入目录 vi /etc/logrotate.d/nginx #编辑脚本 /usr/local/nginx/logs/*.log /usr/local/nginx

Linux下c++程序内存泄漏检测代码范例

Linux下对于程序内存泄漏检测的方法很多,最常用的的莫过于使用valgrind工具.但是valgrind相当于让程序在虚拟机中运行,会带 来较大的系统资源开销,还会对程序的运行效率产生较大影响,对于那种资源占用大的程序,如果需要长时间运行才能暴露的泄漏问题,它就显得不太好用. linux下的c++程序中自己实现一个轻量级的泄漏检测代码其实是比较方便的,下面我就给出一个简单的范例,并作简单的说明.当然,我们还是应该提倡使用共享指针,用共享指针自动管理内存可以避免内存泄漏这样的不必要的麻烦. 基本

Linux下实现SNMP一键安装的Shell脚本_linux shell

Net-SNMP是一个免费的.开放源码的SNMP实现,以前称为UCD-SNMP.SNMP 很多都用其安装之后,作为监控宝和阿里云的系统信息监控使用.下面就来分享linux下实现SNMP一键安装的shell脚本: #!/usr/bin/env bash export LC_ALL=C if [ "$(id -u)" != "0" ] then echo "This script. must be run as root" 1>&2 e

linux下apache日志切割介绍

一,cronolog 下载ronolog包:wget -P /usr/lcoal http://cronolog.org/download/cronolog-1.6.2.tar.gz 1,install: cd /usr/local && tar xf cronolog-1.6.2.tar.gz && cd cronolog-1.6.2 && ./configure && make && make install 2,配置ht

几款Linux下的日志书写工具

最近将工作环境切换到了Ubuntu 10.04 下,非常怀念原来的 Liver Writer,于是Google了一下,找找看Linux下是否有同样出色的离线博客编辑工具,下面是整理的一些结果,分享出来. 对Linux下的用户而言,富文本的编辑器选择确实比较少,但也并不是没有,下面就是几款比较好用的编辑器. 1.GNOME Blog GNOME-Blog虽然支持的特性比较少,但是却提供了足够的效率和方便.作为与GNOME集成的一款软件,安装起来也很方便.笔者的Ubuntu下,使用Package M

linux下oracle重启、启动、停止脚本

网站的服务中断了,重启下发现是oralce服务不存在,又不想重启机器,就重新启动下oralce,再重启服务,搞定. 操作的为oracle9i:(其他应该也可以用吧记录如下)声明:坚挺器(应该理解的哦,信息发不出去,你懂的,就用这个了) 手动操作  代码如下 复制代码 (1) 以oracle身份登录数据库,命令:su – oracle (2) 进入Sqlplus控制台,命令:sqlplus /nolog (3) 以系统管理员登录,命令:connect / as sysdba (4) 启动数据库,命

Linux下的日志维护技巧

1.系统日志 /var/log/messages不仅是服务器的系统日志,很多时候它也包括许多服务的日志,所以它被称为"杂货铺",建议重点关注.大家一般都喜欢用以下命令来看最后10条日志:tail -n10/var/log/messages. 其实还可以将一段日志保存成文件(Xmanager3.0企业版的shell也有日志录像截取功能),或者直接用vim来处理.我以前配置主从复制的bind服务器时,有时会因为权限的原因报错,这时就可以在一台报错的服务器上用命令tail -f/var/lo

Linux下架构日志服务器

一:原理: 日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹.日志主要的功能是审计和监测.它还可以实时地监测系统状态,监测和追踪侵入者.日志也是用户应该注意的地方之一. 不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件.用户可以通过日志文件检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者的踪迹.日志的两个比较重要的作用是:审核和监测.配置好的Linux的日