指定规则:
对于日志A,日志A每天会增加一次内容,内容格式如下:
start time is:2013-02-06 09:00:00 X行
#中间可能有内容#
end time is:2013-02-06 09:02:32 Y行
如果在X行和Y行之间有内容,则需要将中间包含的内容发邮件给指定人员
实现:
首先需要说明一点,以下代码只是产生邮件文件并且上传到指定服务器,发送邮件的功能由指定服务器进行统一处理。在处理的过程中文件都是以二进制模式打开,不涉及编码的转换,可以避免各种编码造成的问题,只有在确实需要进行文字匹配之前进行解码。邮件文件使用命名的临时文件。
#! /usr/local/bin/python3
import enviroment as eo
import datetime
import re
def check_logs(logpath):
date_format='%Y-%m-%d'
now_format=datetime.datetime.today().strftime(date_format)
re_begin=re.compile('start time is:'+now_format)
re_end=re.compile('end time is:'+now_format)
examine_tag=0
with open(logpath,'rb') as file_name:
line=file_name.readline()
while line:
line=line.decode('gb2312')
if re_begin.search(line):
examine_tag=1
pos=file_name.tell()
line=file_name.readline()
continue
if examine_tag==1:
if re_end.search(line):
return
else:
break
line=file_name.readline()
if pos:
file_name.seek(pos)
warn_content=file_name.read()
eo.send_mail_X('',warn_content)
if __name__=='__main__' :
logpath=''
check_logs(logpath)
enviroment.py中包括以下几个相关函数。
def send_mail_X(mailname,mailcontent):
receivers=[]
gen_mail(receivers,mailname,mailcontent)
def gen_mail(receivers,mailtag,mailname,mailcontent):
data_tag=datetime.datetime.today().strftime('%Y-%m-%d')
with tempfile.NamedTemporaryFile(prefix=mailtag+'.',suffix='.mail') as temp_file:
temp_file.write(('Subject: '+mailtag+''+mailname+' '+data_tag+'\n').encode())
temp_file.write(('From:'+mailtag+''+'\n').encode())
for receiver in receivers:
temp_file.write(('Cc:'+receiver+'\n').encode())
temp_file.write(mailcontent)
temp_file.seek(0)
upload_file_fromtemp(temp_file)
def upload_file_fromtemp(temp_file):
ftp=FTP()
ftp.connect('',21)
ftp.login('','')
filebasename=os.path.basename(temp_file.name)
ftmcmd='STOR '+filebasename
ftp.storbinary(ftmcmd,temp_file)