python收入波动告警分析_基于Python 的关键字监控及告警

#!/bin/python#coding:utf-8

importsys

reload(sys)

sys.setdefaultencoding('utf8')importreimportosfrom urllib importurlencodeimportloggingimportfilelockimporttimeimporttraceback#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'

defreadOnly(filename):return open(filename,'r')#pass

defreadWrite(filename):return open(filename,'rw')#pass

defwriteOnly(filename):return open(filename,'w')#pass

#def closesfile():#pass

defgetStartPosLog(posFiles):

txt=readOnly(posFiles)

result={}for i intxt :

filename,pos=i.split(':')if filename != '':

result[filename]=posreturnresult

txt.close()defrematch(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

returnlen(resultList),regular , resultList[0]exceptException as e :printereturn 0 , regular , ''

#pass

defgetEndPost(f):

filename=readOnly(f)try:

nowpos=filename.tell()

filename.seek(0,2)

endpos=filename.tell()

filename.seek(nowpos,0)except:

endpos=0

filename.close()returnendpos#pass

defgetDistinct(startpos,endpos):return endpos-startposdefgetText(f,startpos,endpos):

filename=readOnly(f)

filename.seek(startpos,0)

textLength=getDistinct(startpos,endpos)

text=filename.read(textLength)

filename.close()returntextdefupdatePosLog(posResult,posFiles):

f=writeOnly(posFiles)#print 'posResult ',posResult

for k inposResult.keys() :

v=posResult[k]

f.writelines('%s:%s\n' %(k,v))

f.close()pass

defgetAlterConfi(filename):#文件:关键字:出现次数:告警方式:联系方式:联系组

f=readOnly(filename)

result={}for lines inf.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"]=alterMessageexceptException as e:printeprint '错误的配置 %s' % (lines.strip('\n'))pass

returnresultdefsendSms(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 ) )defmain():globalposFilesglobalconfigFile

AlterConfi=getAlterConfi(configFile)printAlterConfi

posResult=getStartPosLog(posFiles)

posResult_bak=getStartPosLog(posFiles)#print posResult

for filename inAlterConfi.keys() :

keyDict=AlterConfi[filename]print '开始检查文件',filename#print rematch(filename,r'#')[0]

if notos.path.exists(filename):print 'file "%s" not exist ,pass' %(filename)#continue

ifos.path.exists(filename):

endpos=getEndPost(filename)if endpos ==0 :print 'file "%s" is empty ,pass' %(filename)else:try:

startpos=int(posResult[filename])except:

startpos=0print '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'] , '关键字', resultListif 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]=endposprint '打印文件偏移量信息',posResult_bak#正式时需要开启

updatePosLog(posResult_bak,posFiles)if __name__ == '__main__':

lock= filelock.FileLock("/home/apps/logmon-job/logmon.py.lock")iflock:

logging.info("CaiWeiCheng Get Lock.start!!!")try:

with lock.acquire(timeout=5):while 1:

main()

time.sleep(60)#pass

#except filelock.timeout :

exceptException as e :printtraceback.format_exc()print "timeout"logging.warning("get file lock timeout")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值