全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

为了解决日志文件监控的问题, 使用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关键字监控  # Python关键字告警  # Python中关键字nonlocal和global的声明与解析  # Python爬虫:通过关键字爬取百度图片  # Python 中的with关键字使用详解  # 深入解析Python编程中super关键字的用法  # 编写Python小程序来统计测试脚本的关键字  # Python查询阿里巴巴关键字排名的方法  # python关键字and和or用法实例  # Python中super关键字用法实例分析  # Python中关键字is与==的区别简述  # phpsir 开发 一个检测百度关键字网站排名的python 程序  # 偏移量  # 时需  # 大家多多  # 长度为  # 完成了  # filemode  # basDir  # mac  # Desktop  # pos  # configFile  # log  # posFiles  # lineno  # levelname  # filename  # line  # message  # asctime  # Users 


相关文章: 在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  c# await 一个已经完成的Task会发生什么  宁波免费建站如何选择可靠模板与平台?  如何通过虚拟机搭建网站?详细步骤解析  如何通过NAT技术实现内网高效建站?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  香港服务器部署网站为何提示未备案?  网站制作需要会哪些技术,建立一个网站要花费多少?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  网站制作说明怎么写,简述网页设计的流程并说明原因?  建站之家VIP精选网站模板与SEO优化教程整合指南  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  已有域名和空间,如何快速搭建网站?  建站主机选哪家性价比最高?  如何快速生成高效建站系统源代码?  定制建站策划方案_专业建站与网站建设方案一站式指南  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  长沙做网站要多少钱,长沙国安网络怎么样?  建站之星×万网:智能建站系统+自助建站平台一键生成  如何用花生壳三步快速搭建专属网站?  ,怎么在广州志愿者网站注册?  建站之星代理平台如何选择最佳方案?  如何在建站主机中优化服务器配置?  如何选择建站程序?包含哪些必备功能与类型?  宝塔新建站点为何无法访问?如何排查?  大连网站制作公司哪家好一点,大连买房网站哪个好?  中山网站制作网页,中山新生登记系统登记流程?  图册素材网站设计制作软件,图册的导出方式有几种?  制作网站外包平台,自动化接单网站有哪些?  网站制作壁纸教程视频,电脑壁纸网站?  宝塔建站无法访问?如何排查配置与端口问题?  山东网站制作公司有哪些,山东大源集团官网?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  建站之星后台管理系统如何操作?  建站168自助建站系统:快速模板定制与SEO优化指南  如何零成本快速生成个人自助网站?  已有域名和空间如何快速搭建网站?  如何构建满足综合性能需求的优质建站方案?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  如何选择高效可靠的多用户建站源码资源?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在阿里云域名上完成建站全流程?  ,sp开头的版面叫什么?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何实现建站之星域名转发设置?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。