基于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 MD5文件生成码
Jan 12 Python
python随机生成指定长度密码的方法
Apr 04 Python
Python常用的爬虫技巧总结
Mar 28 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
python统计指定目录内文件的代码行数
Sep 19 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 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容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
PHP学习笔记之session
2018/05/06 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
DWR Ext 加载数据
2009/03/22 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
浅谈javascript中this在事件中的应用
2015/02/15 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
RequireJs的使用详解
2017/02/19 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
2020/05/29 jQuery
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python中random模块生成随机数详解
2016/03/10 Python
如何用Python合并lmdb文件
2018/07/02 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python得到windows自启动列表的方法
2018/10/14 Python
Python中new方法的详解
2019/01/15 Python
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
导航工程专业自荐信
2014/09/02 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
2014年流动人口工作总结
2014/11/26 职场文书