场景:周一到周五早上6点半检查日志中的关键字,并发送相应的成功或者失败短信
用python27版本实现
日志内容如下:
[16-08-04 06:30:39] Init Outer: StkID:20205 Label:7110 Name:02ͨ Type:3 PriceDigit:4 VolUnit:0 FloatIssued: 0 TotalIssued: 0 LastClose:0 AdvStop:0 DecStop:0
[16-08-04 06:30:39] Init Outer: StkID:20206 Label:9802 Name:982 Type:3 PriceDigit:4 VolUnit:0 FloatIssued: 0 TotalIssued: 0 LastClose:0 AdvStop:0 DecStop:0
[16-08-04 06:30:39] IB Recv DCT_STKSTATIC, Stock Total = 20207 Day=20160804, Ver=1470283608
配置文件如下:
[MobileNo]
user1 = num1
user2 = num2
user3 = num3
[code_IB]
keys = Stock Total
filepath = /home/level2/ib/datacollect.log
exepath = /home/level2/ib
exefile = dcib.exe
failmsg = IB init fail!
day_of_week = 0-4
hour = 06
minute = 30
python如下:
#-*- encoding: utf-8 -*-
import re
import sys
import os
import time
import requests
import ConfigParser
import logging
import thread
from logging.handlers import RotatingFileHandler
from apscheduler.schedulers.blocking import BlockingScheduler
#通过logging.basicConfig函数对日志的输出格式及方式做相关配置
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='search.log',
filemode='a')
'''
#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
'''
'''
#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler('search.log', maxBytes=1*1024*1024,backupCount=2)
Rthandler.setLevel(logging.INFO)
#formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
#Rthandler.setFormatter(formatter)
logging.getLogger('').addHandler(Rthandler)
'''
#读取配置文件
try:
conf = ConfigParser.ConfigParser() #生成config对象
conf.read("search.ini") #用config对象读取配置文件
#keys = conf.get("main","keys") #指定session,option读取值
#logpath = conf.get("main","filepath")
mobileno = conf.items("MobileNo")
#failmsg = conf.get("msg","fail")
code = conf.sections()
except Exception as exc:
pass
def getconfig(section):
#定义全局变量
global keys, logpath, exepath, exefile, failmsg, day_of_week, hour ,minute
keys = conf.get(section,"keys")
logpath = conf.get(section,"filepath")
exepath = conf.get(section,"exepath")
exefile = conf.get(section,"exefile")
failmsg = conf.get(section,"failmsg")
day_of_week = conf.get(section,"day_of_week")
hour = conf.get(section,"hour")
minute = conf.get(section,"minute")
print keys, logpath, exepath, exefile, failmsg, day_of_week, hour ,minute
#从前端获取参数,关键字,文件名
'''
def getParameters():
ret = []
if len(sys.argv) != 3:
print 'Please input correct parameter,for example:'
print 'python search.py keyword filepath configpath'
else:
for i in range(1,len(sys.argv)):
print i, sys.argv[i]
ret.append(sys.argv[i])
print '+============================================================================+'
print ' Keyword = %s'%sys.argv[1]
return ret
'''
def isFileExists(strfile):
#检查文件是否存在
return os.path.isfile(strfile)
def sendMailOk(timefile):
#初始化正常,发送邮件
datetimes = timefile.split('[')
times = datetimes[1].split(']')
code = timefile.split()
init = [times[0],code[2],"init success!"]
message = ' '.join(init) #使用字符串的join方法,可以把列表的各个元素连接起来
logging.info(message)
url = 'http:/smsNew/sendMessage.html'
#payload = {'clientId':'804D0196-6C0D-4CEF-91E1-1BB85E0217DB','Code':'GB2312','toMobileNo':toMobileNo,'message':message}
#r = requests.post('http:/smsNew/sendMessage.html?clientId=804D0196-6C0D-4CEF-91E1-1BB85E0217DB&Code=GB2312&toMobileNo=18516235206&message=test')
#r = requests.post(url,params = payload)
#print r.url,r.text
for i in range(len(mobileno)):
toMobileNo = mobileno[i][1]
payload = {'clientId':'804D0196-6C0D-4CEF-91E1-1BB85E0217DB','Code':'GB2312','toMobileNo':toMobileNo,'message':message}
r = requests.post(url,params = payload)
print r.url,r.text
print toMobileNo
#print r.text
#getConfig()
def sendMalFail():
#初始化失败发送短信
url = 'http:/smsNew/sendMessage.html'
for i in range(len(mobileno)):
toMobileNo = mobileno[i][1]
payload = {'clientId':'804D0196-6C0D-4CEF-91E1-1BB85E0217DB','Code':'GB2312','toMobileNo':toMobileNo,'message':failmsg}
r = requests.post(url,params = payload)
logging.error(failmsg)
print r.url,r.text
print toMobileNo
def Search(keyword, filename):
#在文件中搜索关键字
if(isFileExists(filename) == False ):
#print 'Input filepath is wrong,please check agin!'
logging.error('Input filepath is wrong,please check agin!')
return False
#sys.exit()
linenum = 1
with open(filename, 'r') as fread:
lines = fread.readlines()
for line in lines:
rs = re.search(keyword, line)
if rs:
#打印关键字所在行
#sys.stdout.write('line:%d '%linenum)
#print line
lsstr = line.split(keyword)
#strlength = len(lsstr)
#logging.info('DC init success! ')
sendMailOk(lsstr[0])
'''
#打印搜索关键字所在行信息
for i in range(strlength):
if (i < (strlength - 1)):
sys.stdout.write(lsstr[i].strip())
sys.stdout.write(keyword)
else:
sys.stdout.write(lsstr[i].strip() + '\n')
'''
#关闭打印日志程
killdc = "pkill " + exefile
os.system(killdc)
return True
#sys.exit()
linenum = linenum + 1
logging.debug('DC not init ,tye agin!')
return False
def executeSearch():
'''
ls = getParameters()
if(len(ls) == 2):
while True:
for i in range(5):
Search(ls[0], ls[1]) #初始化成功退出脚本,否则继续循环
#print i
time.sleep(60)
sendMalFail() #连续5次查找都没有初始化,发送失败短信
else:
print 'There is a parameter error occured in executeSearch()!'
'''
#print keys,logpath,mobileno
#os.system('cd /home/level2/ib && /bin/echo > datacollect.log && nohup ./dcib.exe > /dev/null 2>&1 &')
startdc = "cd " + exepath + " && /bin/echo > datacollect.log && nohup ./" + exefile + " > /dev/null 2>&1 &"
os.system(startdc)
time.sleep(3)
for i in range(5):
if Search(keys,logpath)== True:
return True
time.sleep(60)
sendMalFail()
while Search(keys,logpath) == False:
time.sleep(60)
def cron():
scheduler = BlockingScheduler()
scheduler.add_job(executeSearch, 'cron', day_of_week=day_of_week,hour=hour, minute=minute)
scheduler.start()
def main():
#scheduler = BlockingScheduler()
for i in range(0,len(code)):
if re.search('code',code[i]):
getconfig(code[i])
print "keys=",keys, "; logpath=",logpath, "; exepath=",exepath, "; exefile=",exefile, "; failmsg=",failmsg, "; day_of_week=",day_of_week, "; hour=",hour ,"; minute=",minute
scheduler = BlockingScheduler()
scheduler.add_job(executeSearch, 'cron', day_of_week=day_of_week,hour=hour, minute=minute)
scheduler.start()
#thread.start_new_thread(cron,())
#time.sleep(3)
#executeSearch()
if __name__=='__main__':
main()
# executeSearch()