# -*- coding: utf-8 -*-
'''
自动化巡检脚本v2.0
用法:切换目录到脚本所在目录,shell中输入:python3 脚本名 文件名 需要巡检的行数
目前版本未经过优化,仍有一些瑕疵. 推荐使用python3.4以上版本.
新增:进一步筛选时间相隔两分钟以内的错误信息
作者:loki
邮箱:549135011@qq.com
如有问题欢迎指教
'''
def get_file(line_num):#读取文件,分割文件,返回分割结果
big_list=[]
temp_li=[]
for i in range(line_num):
line=file.readline()#逐行读取文件
if pattern.match(line):#若读到分割符.则停止,返回读取结果
big_list.append(temp_li)
temp_li=[]
continue
else:
temp_li.append(line)#将读取到的行保存进临时列表
return big_list
#################################################################
def analyse_file(li):#读取分割结果,返回分析结果
analyse_info=li[0]
cost=analycost_pattern.search(analyse_info).group(1)
cost=eval(cost)
if cost>500:#此处可以根据需要修改超时的时间值
erro_list.append(li)
##################################################################
def analyse_time(error_list):#筛选出错误相隔时间小于等于两分钟的条目
timestamp_list=[]
index_list=[]
pattern=re.compile(r'.*?(\d*-\d*-\d*\s\d*:\d*:\d*).*')
for result in error_list:
strtime=pattern.match(result[0]).group(1)
tupletime=time.strptime(strtime,'%Y-%m-%d %H:%M:%S')
timestamp=time.mktime(tupletime)
timestamp_list.append(timestamp)
#print(timestamp_list)
cur=0
for num in range(len(timestamp_list)-1):
nex=cur+1
if timestamp_list[nex]-timestamp_list[cur]<=120:#此处120秒,指的是相隔两分钟之内的信息才被认为有效
index_list.append(cur)
index_list.append(nex)
cur=nex
else:
cur=nex
index_list=list(set(index_list))
return index_list
#################################################################
if __name__ == '__main__':
import re
import sys
import time
f=open('./log.txt','a')
file=open(sys.argv[1],'r')
pattern=re.compile(r'^\n$')
analycost_pattern=re.compile(r'.*\[Cost\]:(\d*).*')
erro_list=[]
result_list=[]
li=get_file(int(sys.argv[2]))
block_num=len(li)
try:
for i in range(block_num):
li.remove([])
except:
pass
for j in li:
analyse_file(j)
index_list=analyse_time(erro_list)
for index in index_list:
print(erro_list[index][0])
f.write(erro_list[index][0])
f.close()
可以筛选大部分的oracle日志的信息