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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章