基于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 相关文章推荐
用map函数来完成Python并行任务的简单示例
Apr 02 Python
两个使用Python脚本操作文件的小示例分享
Aug 27 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
django框架基于queryset和双下划线的跨表查询操作详解
Dec 11 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
Apr 16 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
python实现图片批量压缩
Apr 24 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
pytorch 6 batch_train 批训练操作
May 28 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使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PDO::errorCode讲解
2019/01/28 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
Bootstrap modal只加载一次数据的解决办法(推荐)
2017/11/24 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
python简单实现基数排序算法
2015/05/16 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
2020/05/25 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
css3与html5实现响应式导航菜单(导航栏)效果分享
2014/02/12 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
九年级英语教学反思
2014/01/31 职场文书
如何写求职信
2014/05/24 职场文书
政治学求职信
2014/06/03 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
颐和园的导游词
2015/01/30 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python