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分钟自动运行。
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()    
   


发布了59 篇原创文章 · 获赞 2 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章