侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   245

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

环境 python 2.7

依赖包 time \ traceback \ filelock \ logging

代码如下:

#!/bin/python#coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf8')import reimport osfrom urllib import urlencodeimport loggingimport filelockimport timeimport traceback#config.conf#文件1:关键字A|关键字B:出现次数:告警方式:联系方式:联系组:某某异常#文件2:关键字C|关键字D:出现次数:告警方式:联系方式:联系组:某某异常#rc.local增加#sudo -u monitor /bin/bash -x /home/apps/logmon-job/deploy_py.shlogging.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')  # passdef readWrite(filename):  return open(filename,'rw')  # passdef writeOnly(filename):  return open(filename,'w')  # pass# def closesfile():#   passdef 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 , ''  # passdef 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   # passdef getDistinct(startpos,endpos):  return endpos-startposdef getText(f,startpos,endpos):  filename=readOnly(f)  filename.seek(startpos,0)  textLength=getDistinct(startpos,endpos)  text=filename.read(textLength)  filename.close()  return textdef 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()  passdef 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 resultdef 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")

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


  • 上一条:
    用virtualenv建立多个Python独立虚拟开发环境
    下一条:
    Python中装饰器兼容加括号和不加括号的写法详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客