Linux中运行python实现错误日志定时报警
又到了毕业季,实验室不是很忙,要给自己找点事做。于是打算从6.21开始学习python。中间又是拍毕业照又是吃散伙饭,还是赶紧写个python的小程序,免得前面看的都忘记了。
1. crontab用法
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。crontab文件包含送交cron守护进程的一系列作业和指令。每个用户可以拥有自己的crontab文件;同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc或者/etc之下的子目录中,而这个文件只能由系统管理员来修改。crontab文件的每一行均遵守特定的格式,由空格或tab分隔为数个领域,每个领域可以放置单一或多个数值。
基本格式:
* * * * * command
分 时 日 月 周 命令
逗号 (‘,’)分开的值,例如:“1,3,4,7,8”
连词符 (‘-’) 制定值的范围,例如:“1-6”,意思等同于“1,2,3,4,5,6”
星号 ('*') 代表任何可能的值。例如,在“小时域”里的星号等于是“每一个小时”,如果在小时中使用*/1表示每小时
例子:
*/2 * * * * root …………… #每两分钟就执行……..
0 6,12,18 * * * root …………… #每天6点、12点、18点执行……..
0 23-7/2 * * * root …………… #每天晚上11点到7,每隔2小时执行……..
0 4 1 1 * root …………… #1月1日早上4点执行………
2. python发送邮件
我们可以通过python的smtplib模块轻松的实现发送电子邮件。需要的函数如下:
连接到SMTP服务器,参数表示SMTP主机和端口
SMTP.connect([host[,port]])
登录SMTP服务器
SMTP.login(user, password)
发送邮件,msg是字符串,表示邮件内容
SMTP.sendmail(from_addr, to_addrs, msg)
3. python实现错误日志报警
1). 获取当前时间和前1小时的时间,比如当前时间10.00,则要计算出9:00和10:00这两个时间点。
注:在当前时间是00:00的时候是计算23:00-00:00时间段的错误日志,需要特殊处理,将00:00增加24小时。
2).遍历日志文件,利用正则表达式取出每条日志发生的时间,如果在9:00-10:00这个范围内,则利用正则表达式判断这条日志是否符合错误日志的格式,如果符合,则错误日志次数加1。如果日志时间小于9:00,则continue,继续寻找。如果日志时间大于10:00,则跳出循环,结束读取。
3). 如果错误日志次数超过阀值,则通过python中的smtplib模块发送邮件。
4).要求每小时第一分钟运行程序,所以要修改linux中/etc/crontab脚本,让python程序定时执行。
在crontab脚本中增加:00 /1 ** root python/home/qing/Program/main.py,即让main.py程序每隔1小时的第1分钟自动运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | import re import time import smtplib import datetime from email.mime.text import MIMEText #发邮件函数 def send_mail(to_list, sub, content): ##################################### #设置服务器,用户名,口令以及邮箱后缀 mail_host = 'smtp.126.com' mail_user = '***' mail_pass = '***' mail_postfix = '126.com' ##################################### me = mail_user+"<"+mail_user+"@"+mail_postfix+">" msg = MIMEText(content) msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: s = smtplib.SMTP() #连接到SMTP服务器,参数表示SMTP主机 s.connect(mail_host) #登录SMTP服务器 s.login(mail_user, mail_pass) #发送邮件,msg是字符串,表示邮件内容 s.sendmail(me, to_list, msg.as_string()) s.close() print 'send success' return True except Exception: print 'send error' return False def error_match(): #要发送对象 mailto_list = ["***@163.com"] f = open('/home/qing/Program/logserver.log', 'r+') count = 0 #获取当前时间 a = datetime.datetime.now() #计算上一个小时的开始时间和结束时间 if a.strftime("%H") == '0': current = (a+datetime.timedelta(hours=24)).strftime("%X") start = (a+datetime.timedelta(hours=23)).strftime("%X") else: current = a.strftime("%X") start = (a-datetime.timedelta(hours=1)).strftime("%X") print 'current:' + current print 'start:' + start #读取每一行 for eachLine in f: everylogtime = re.search('\d{2}:\d{2}:\d{2}', eachLine) if everylogtime is not None: #如果日志时间小于开始时间,继续寻找 if everylogtime.group() < start: continue #如果日志时间大于结束时间,跳出循环 if everylogtime.group() >= current: break print everylogtime.group() patt = '\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2},\d{3}\s*\[\w*\d*-\d*\]\s*\w{4}\s*\[\w*\.\w*\.\w*\.\w*\.\w*\]\s*-\s*.*' m = re.match(patt, eachLine) #如果和错误日志匹配,数量加1 if m is not None: count += 1 print ('count:%d' % count) f.close() if count > 2: send_mail(mailto_list, "Alert email", "Wrong logs beyond alarms - this is python sent") if __name__ == '__main__': error_match() |