基于Python的關(guān)鍵字監(jiān)控及告警
更新時間:2017年07月06日 07:55:22 作者:偉成
這篇文章主要為大家詳細(xì)介紹了基于Python的關(guān)鍵字監(jiān)控及告警,具有一定的參考價值,感興趣的小伙伴們可以參考一下
為了解決日志文件監(jiā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 '錯誤的配置 %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 #分析關(guān)鍵字 #print AposlterConfi[filename] matchCount , regular , resultList = rematch(text,keyDict['key']) print '匹配關(guān)鍵字',regular , '匹配長度為', 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 #正式時需要開啟 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")
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- Python中關(guān)鍵字nonlocal和global的聲明與解析
- Python爬蟲:通過關(guān)鍵字爬取百度圖片
- Python 中的with關(guān)鍵字使用詳解
- 深入解析Python編程中super關(guān)鍵字的用法
- 編寫Python小程序來統(tǒng)計測試腳本的關(guān)鍵字
- Python查詢阿里巴巴關(guān)鍵字排名的方法
- python關(guān)鍵字and和or用法實例
- Python中super關(guān)鍵字用法實例分析
- Python中關(guān)鍵字is與==的區(qū)別簡述
- phpsir 開發(fā) 一個檢測百度關(guān)鍵字網(wǎng)站排名的python 程序
相關(guān)文章
使用python flask框架開發(fā)圖片上傳接口的案例詳解
剛領(lǐng)導(dǎo)安排任務(wù),需求是這樣的開發(fā)一個支持多格式圖片上傳的接口,并且將圖片壓縮,支持在線預(yù)覽圖片,下面小編分享下使用python flask框架開發(fā)圖片上傳接口的案例詳解,感興趣的朋友一起看看吧2022-04-04pyqt5教程QGraphicsScene及QGraphicsView使用基礎(chǔ)
這篇文章主要為大家介紹了pyqt5教程中QGraphicsScene及QGraphicsView使用基礎(chǔ),有序要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10