基于Python的關(guān)鍵字監(jiān)控及告警
更新時(shí)間:2017年07月06日 07:55:22 作者:偉成
這篇文章主要為大家詳細(xì)介紹了基于Python的關(guān)鍵字監(jiān)控及告警,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
為了解決日志文件監(jiān)控的問(wèn)題, 使用python腳本完成了基于關(guān)鍵字的告警功能
環(huán)境 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:關(guān)鍵字A|關(guān)鍵字B:出現(xiàn)次數(shù):告警方式:聯(lián)系方式:聯(lián)系組:某某異常
#文件2:關(guān)鍵字C|關(guān)鍵字D:出現(xiàn)次數(shù):告警方式:聯(lián)系方式:聯(lián)系組:某某異常
#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 '匹配結(jié)果為',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):
#文件:關(guān)鍵字:出現(xiàn)次數(shù):告警方式:聯(lián)系方式:聯(lián)系組
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 '錯(cuò)誤的配置 %s' % (lines.strip('\n'))
pass
return result
def sendSms(account,message):
data={
'accounts':account ,
'templateName':'opalert' ,
'alertcontent':message ,
}
encodeMessage=urlencode(data)
#正式時(shí)需要開(kāi)啟
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 '開(kāi)始檢查文件 ',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
#分析關(guān)鍵字
#print AposlterConfi[filename]
matchCount , regular , resultList = rematch(text,keyDict['key'])
print '匹配關(guān)鍵字',regular , '匹配長(zhǎng)度為', matchCount , '關(guān)鍵字告警閾值' ,keyDict['count'] , '關(guān)鍵字' , 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,'發(fā)現(xiàn)%s 告警,關(guān)鍵字:%s ,出現(xiàn)次數(shù):%s ' %(keyDict['alterMessage'] , resultList , matchCount ))
pass
#記錄末尾偏移量
posResult_bak[filename]=endpos
print '打印文件偏移量信息',posResult_bak
#正式時(shí)需要開(kāi)啟
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")
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Python中關(guān)鍵字nonlocal和global的聲明與解析
- Python爬蟲:通過(guò)關(guān)鍵字爬取百度圖片
- Python 中的with關(guān)鍵字使用詳解
- 深入解析Python編程中super關(guān)鍵字的用法
- 編寫Python小程序來(lái)統(tǒng)計(jì)測(cè)試腳本的關(guān)鍵字
- Python查詢阿里巴巴關(guān)鍵字排名的方法
- python關(guān)鍵字and和or用法實(shí)例
- Python中super關(guān)鍵字用法實(shí)例分析
- Python中關(guān)鍵字is與==的區(qū)別簡(jiǎn)述
- phpsir 開(kāi)發(fā) 一個(gè)檢測(cè)百度關(guān)鍵字網(wǎng)站排名的python 程序
相關(guān)文章
如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能
這篇文章主要介紹了如何通過(guò)Python3和ssl實(shí)現(xiàn)加密通信功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
python 迭代器和iter()函數(shù)詳解及實(shí)例
這篇文章主要介紹了python 迭代器和iter()函數(shù)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
使用python flask框架開(kāi)發(fā)圖片上傳接口的案例詳解
剛領(lǐng)導(dǎo)安排任務(wù),需求是這樣的開(kāi)發(fā)一個(gè)支持多格式圖片上傳的接口,并且將圖片壓縮,支持在線預(yù)覽圖片,下面小編分享下使用python flask框架開(kāi)發(fā)圖片上傳接口的案例詳解,感興趣的朋友一起看看吧2022-04-04
pyqt5教程QGraphicsScene及QGraphicsView使用基礎(chǔ)
這篇文章主要為大家介紹了pyqt5教程中QGraphicsScene及QGraphicsView使用基礎(chǔ),有序要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10

