基于Python的关键字监控及告警


Posted in Python onJuly 06, 2017

为了解决日志文件监控的问题, 使用python脚本完成了基于关键字的告警功能

环境 python 2.7

依赖包 time \ traceback \ filelock \ logging

代码如下:

#!/bin/python
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import re
import os
from urllib import urlencode
import logging
import filelock
import time
import traceback

#config.conf
#文件1:关键字A|关键字B:出现次数:告警方式:联系方式:联系组:某某异常
#文件2:关键字C|关键字D:出现次数:告警方式:联系方式:联系组:某某异常

#rc.local增加
#sudo -u monitor /bin/bash -x /home/apps/logmon-job/deploy_py.sh

logging.basicConfig(level=logging.DEBUG,
          format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
          datefmt='%a, %d %b %Y %H:%M:%S',
          filename='/home/logs/monitor/logmon.log',
          #filename='/Users/mac/Desktop/logmon/logmon.log',
          filemode='a')

basDir='/home/apps/logmon-job/'

posFiles=basDir+'/pos.log'
configFile=basDir+'config.conf'

def readOnly(filename):
  return open(filename,'r')
  # pass

def readWrite(filename):
  return open(filename,'rw')
  # pass
def writeOnly(filename):
  return open(filename,'w')
  # pass

# def closesfile():
#   pass

def getStartPosLog(posFiles):
  txt=readOnly(posFiles)
  result={}
  for i in txt :
    filename,pos=i.split(':')
    if filename != '' :
      result[filename]=pos
  return result
  txt.close()

def rematch(txt,regular):
  resultList=[]
  for t in txt.split(r'\n') :
    # print t
    # pattern = re.compile(r':')
    pattern = re.compile(regular)

    resultList=(pattern.findall(t))
  try :
    # print '匹配结果为',resultList 
    return len(resultList),regular , resultList[0]
  except Exception as e :
    print e 
    return 0 , regular , ''
  # pass

def getEndPost(f):
  filename=readOnly(f)
  try :
    nowpos=filename.tell()
    filename.seek(0,2)
    endpos=filename.tell()
    filename.seek(nowpos,0)
  except :
    endpos = 0
  filename.close()
  return endpos 
  # pass

def getDistinct(startpos,endpos):
  return endpos-startpos

def getText(f,startpos,endpos):

  filename=readOnly(f)
  filename.seek(startpos,0)
  textLength=getDistinct(startpos,endpos)
  text=filename.read(textLength)
  filename.close()
  return text

def updatePosLog(posResult,posFiles):
  f=writeOnly(posFiles)
  # print 'posResult ',posResult
  for k in posResult.keys() :
    v=posResult[k]
    f.writelines('%s:%s\n' %(k,v))
  f.close()

  pass

def getAlterConfi(filename):
  #文件:关键字:出现次数:告警方式:联系方式:联系组
  f=readOnly(filename)
  result={}
  for lines in f.readlines():
    # print lines
    try :
      filename , key , count , alterType , alterAddress , alterGroup ,alterMessage= lines.strip('\n').split(":")
      result[filename]={}
      result[filename]["key"]     =key
      result[filename]["count"]    =count
      result[filename]["alterType"]  =alterType
      result[filename]["alterAddress"]=alterAddress
      result[filename]["alterGroup"] =alterGroup
      result[filename]["alterMessage"]=alterMessage
    except Exception as e:
      print e
      print '错误的配置 %s' % (lines.strip('\n'))
      pass
  return result

def sendSms(account,message):

  data={
    'accounts':account ,
    'templateName':'opalert' ,
    'alertcontent':message ,
  }
  encodeMessage=urlencode(data)

  #正式时需要开启
  os.system('curl -I "http://10.1.1.146:8080/sms/send?%s" ' % ( encodeMessage ) )

def main():
  global posFiles
  global configFile

  AlterConfi=getAlterConfi(configFile)
  print AlterConfi
  posResult=getStartPosLog(posFiles)
  posResult_bak=getStartPosLog(posFiles)
  # print posResult
  for filename in AlterConfi.keys() :
    keyDict=AlterConfi[filename]
    print '开始检查文件 ',filename
    #print rematch(filename,r'#')[0] 
    if not os.path.exists(filename):
      print 'file "%s" not exist ,pass' % (filename)
      # continue
    if os.path.exists(filename):

      
      endpos = getEndPost(filename)

      if endpos == 0 :
        print 'file "%s" is empty ,pass' % (filename)
      else :
        try :
          startpos= int(posResult[filename])
        except :
          startpos = 0
        print 'startpos is %.f , endpos is %.f' %(startpos ,endpos)

        #处理切割后,偏移量归位
        if startpos > endpos :
          startpos = 0

        text = getText(filename,startpos,endpos)
        # print '%s text is : '%(filename) , text

        #分析关键字
        #print AposlterConfi[filename]
        matchCount , regular , resultList = rematch(text,keyDict['key'])
        print '匹配关键字',regular , '匹配长度为', matchCount , '关键字告警阈值' ,keyDict['count'] , '关键字' , resultList

        if int(matchCount) >= int(keyDict['count']) :
          print 'alterGroup len is ',len(keyDict['alterGroup'])
          print 'alterType len is ' ,len(keyDict['alterType'])
          if len(keyDict['alterGroup']) > 0:
            pass
          if len(keyDict['alterType']) >0:
            if keyDict['alterType'].upper() == 'SMS' :
              for account in keyDict['alterAddress'].split(',') :
                if len(account) >0 :
                  sendSms(account,'发现%s 告警,关键字:%s ,出现次数:%s ' %(keyDict['alterMessage'] , resultList , matchCount ))
            pass
        #记录末尾偏移量
        posResult_bak[filename]=endpos


    
  print '打印文件偏移量信息',posResult_bak
    
  #正式时需要开启
  updatePosLog(posResult_bak,posFiles)


if __name__ == '__main__':
  lock = filelock.FileLock("/home/apps/logmon-job/logmon.py.lock")
  if lock:
    logging.info("CaiWeiCheng Get Lock.start!!!")
  try:
    with lock.acquire(timeout=5):
      while 1 :
        main()
        time.sleep(60)
      # pass
  #except filelock.timeout :
  except Exception as e :
    print traceback.format_exc()
    print "timeout"     
    logging.warning("get file lock timeout")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
Python实现KNN邻近算法
Jan 28 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
Python闭包思想与用法浅析
Dec 27 Python
python中的数据结构比较
May 13 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
基于Python绘制个人足迹地图
Jun 01 Python
简单了解如何封装自己的Python包
Jul 08 Python
Python 多进程原理及实现
Dec 21 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 #Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 #Python
利用python实现简单的循环购物车功能示例代码
Jul 05 #Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 #Python
Python对象类型及其运算方法(详解)
Jul 05 #Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 #Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
Jul 04 #Python
You might like
PHP的开合式多级菜单程序
2006/10/09 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
PHP return语句的另一个作用
2014/07/30 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
js获取Get值的方法
2016/09/29 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
Python中生成Epoch的方法
2017/04/26 Python
python enumerate函数的使用方法总结
2017/11/15 Python
python mysql断开重连的实现方法
2019/07/26 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
Java语言程序设计测试题改错题部分
2014/07/22 面试题
总裁办公室主任职责
2014/01/02 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
教师远程培训感言
2014/03/06 职场文书
经典广告词大全
2014/03/14 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
2014年团队工作总结
2014/11/24 职场文书
骨干教师个人总结
2015/02/11 职场文书
小学公民道德宣传日活动总结
2015/03/23 职场文书
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫