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()
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分鐘自動運行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.