日志查找到第一个关键字后反向查找第二个关键字

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志查找到第一个关键字后反向查找第二个关键字相关的知识,希望对你有一定的参考价值。

用户的一个需求

catalina.out的日志中,先找到第一个关键字,然后向上查找第二个关键字,写个小脚本

 1 #!/usr/bin/python
 2 
 3 import datetime, time
 4 import re
 5 import os
 6 
 7 #取得文件名,文件名的时间格式是收到报警的时间减去一小时
 8 def get_filename(input_str):
 9     #如果有输入,整理格式后减去一小时
10     if input_str:
11         t=datetime.datetime.strptime(input_str, "%Y%m%d%H") + datetime.timedelta(hours=-1)
12     #如果无输入,则默认为现在时间再减去一小时
13     else:
14         t=datetime.datetime.now() + datetime.timedelta(hours=-1)
15     #组合成文件名
16     f_name="/app/tomcat/logs/catalina."+t.strftime("%Y-%m-%d-%H")+".out"
17     return f_name
18 
19 #取得第一个关键字的行数
20 def get_line(f_name):
21     with open(f_name, r) as fread:
22         lines = fread.readlines()
23         i=0
24         l_num=[]
25         for line in lines:
26             #第一个关键字
27             keyword1="Could not connect to SMTP host"
28             rs1 = re.search(keyword1, line)
29             i+=1
30             if rs1:
31                 #第一个关键字的行号
32                 l_num.append(i)
33     return l_num
34 
35 #根据第一个关键字的行数向上查找到第二个关键字
36 def get_log(f_name, num):
37     with open(f_name, r) as fread:
38         #把文件倒过来,从第一个关键字所在的行开始查找
39         rlines = fread.readlines()[::-1]
40         j=0
41         rs_str=[]
42         for j in range(len(rlines)-num,len(rlines)):
43             #第二个关键字的正则表达式
44             keyword2="U000\d{4},.*@.*,.\d{2}"
45             rs2 = re.search(keyword2, rlines[j])
46             j+=1
47             if rs2:
48                 #第二个关键字的内容,J由于上面+1了,所以要-1
49                 rs_str.append(rlines[j-1])
50                 break
51     return rs_str
52 
53 def main():
54     #打印说明文字
55     print "Please input alerttime, YYYYMMDDHH exp:2017010113"
56     print "Enter for default (now)"
57     #要求输入
58     input_str = raw_input("input: ")
59     #取得文件名
60     f_name = get_filename(input_str)
61     #判断文件是否存在
62     if os.path.isfile(f_name):
63         l_num = get_line(f_name)
64         if l_num:
65             for num in l_num:
66                 rs_str=get_log(f_name, num)
67                 if rs_str:
68                     #找到日志时的输出
69                     print "-----------------"
70                     print rs_str[0]
71                     print "javax.mail.MessagingException: Could not connect to SMTP host: smtp.partner.outlook.cn, port: 587;"
72                     print "-----------------"
73         #未找到相关日志时的输出
74         else:
75             print "-----------------"
76             print "No Log Found"
77             print "-----------------"
78     #文件不存在时的输出
79     else:
80         print "-----------------"
81         print "File not exist, please check again"
82         print "-----------------"
83 
84 if __name__ == __main__:
85     main()

输出为

[[email protected] logs]# ./findlog.py
Please input alerttime, YYYYMMDDHH exp:2017010113
Enter for default (now)
input: 2017083116
-----------------
2017-08-31 15:00:16,070 DEBUG [java.sql.ResultSet] - {rset-187333} Result: [U0000448, [email protected], ??Buyer, 00]

javax.mail.MessagingException: Could not connect to SMTP host: smtp.partner.outlook.cn, port: 587;
-----------------
-----------------
2017-08-31 15:38:15,980 DEBUG [java.sql.ResultSet] - {rset-187333} Result: [U0000449, [email protected], ??Buyer, 00]

javax.mail.MessagingException: Could not connect to SMTP host: smtp.partner.outlook.cn, port: 587;
-----------------

  

以上是关于日志查找到第一个关键字后反向查找第二个关键字的主要内容,如果未能解决你的问题,请参考以下文章

linux如何在日志中查找关键字

使用 infer 关键字创建反向类型查找? [复制]

linux中日志文件查找,根据关键字

linux查看日志怎么查找关键字

linux查看日志显示行数代码

(王道408考研数据结构)第七章查找-第二节1:顺序查找及其优化