基于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 相关文章推荐
Python 元类使用说明
Dec 18 Python
python中assert用法实例分析
Apr 30 Python
Python装饰器基础详解
Mar 09 Python
Scrapy的简单使用教程
Oct 24 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
opencv实现简单人脸识别
Feb 19 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
Python selenium环境搭建实现过程解析
Sep 08 Python
python map比for循环快在哪
Sep 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新手用的Insert和Update语句构造类
2012/03/31 PHP
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
功能强大的php文件上传类
2016/08/29 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
Python2随机数列生成器简单实例
2017/09/04 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
python实现字符串和字典的转换
2018/09/29 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python requests接口测试实现代码
2020/09/08 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
中科软测试工程师面试题
2012/06/16 面试题
十佳大学生村官事迹
2014/01/09 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
2015年新农合工作总结
2015/03/30 职场文书
2016七夕情人节感言
2015/12/09 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
九年级化学教学反思
2016/02/22 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang