我有一个日志文件,它的格式是这样的,
INFO 2018/11/20 18:56:00 aaaaaaaaaaaaaaaaaaaaaaaaaaaa
INFO 2018/11/20 18:56:00 bbbbbbbbbbbbbbbbbbbbbb
INFO 2018/11/20 18:56:00 cccccccccccccccccccccccccccc
INFO 2018/11/20 18:56:00 ddddddddddddddddddddddd
WARN 2018/11/20 18:56:23 Some Error Message
java.lang.IllegalArgumentException: blahblahblah
INFO 2018/11/20 19:01:23 eeeeeeeeeeeeeeeeeeeeeeeee
我不关心正常的日志,但我想提取包含“异常”字的行,该行应该在某个时间写入(例如在 18:00:00 和 18:59:59 之间。)我是怎么想的首先是在读取日志文件时使用 enumerate 函数获取索引。但是有了这个,我必须至少阅读文件三遍以上。并且 linecache 函数将文件中的每一行加载到内存中。有些文件超过 100MB,所以我知道这是个坏主意。
start = 0
end = 0
with open("filename", "f") as f:
for idx, line in enumerate(f):
if re.search("2018(\/|:|)11(\/|:|)20 18:\d{2}:\d{2}", line):
start = idx
break
for idx, line in enumerate(f):
if re.search("2018(\/|:|)11(\/|:|)20 19:\d{2}:\d{2}", line):
end = idx - 1
break
for i in range(start, end):
line = linecache.getline("filename", i)
if 'Exception' in line:
print line
最关键的问题是日志并不总是写在 xx:00m 或 xx:59m 上。例如,它将在 18:01:00 或 18:03:31 开始......
从昨天开始我就没有想出什么好主意。请帮助我.. 提前致谢。
您实际上不必循环文件 3 次。只需维护循环中的当前行和上一行。
from collections import OrderedDict
import re
result = OrderedDict()
with open("filename", "r") as f:
prev, curr = None, None
for id, line in enumerate(f):
prev = curr
curr = line
if re.search('Exception', line):
if re.search('18:\d{2}:\d{2}', prev):
result[id] = line
print(result)
输出:
OrderedDict([(5, 'java.lang.IllegalArgumentException: blahblahblah\n')])
如果您希望从日志文件中获取所有 1 小时时段的行号,那么您只需要替换'18'
一些变量即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句