在另一个问题Python: Parse log file for pairs of lines中,我提出了以下要求:
我有一个日志文件,需要针对特定事件进行解析。的 问题是我需要的数据来自每个事件条目对 保存所需的数据。
例如,将有一行事件类型= test with 数据,然后不久,又有一行事件类型= test2还有更多数据。
文件中可能存在这些数据对的许多实例,或者 没有。
我需要做的是告诉代码,当它找到一行时 event = test然后还寻找event = test2的下一个实例 通常在日志的后面几行。
我收到了下面的代码的答案,该代码适用于所提供的数据集。问题是在实践中有时数据并不总是具有数据对。在那些情况下,我想获取确实具有对应行的数据,而忽略没有对应对的“坏”行。如果相应的行不存在,则当前代码会出错。我尝试了许多不同的更改以尝试找到解决方案,但未能找到可行的方法。
任何建议表示赞赏。
更新的数据集
2020-08-25 03:36:56.006 INFO Panda HOOK: {"event":"keepalive","time":1600.0064477}
2020-08-25 03:37:01.006 INFO Panda HOOK: {"event":"keepalive","time":1605.0066958}
2020-08-25 03:37:06.004 INFO Panda HOOK: {"event":"keepalive","time":1610.004206}
2020-08-25 03:37:11.003 INFO Panda HOOK: {"event":"keepalive","time":1615.0032498}
2020-08-25 03:37:16.005 INFO Panda HOOK: {"event":"keepalive","time":1620.0056292}
2020-08-25 03:37:21.001 INFO Panda HOOK: {"event":"keepalive","time":1625.0011002}
2020-08-25 03:37:26.007 INFO Panda HOOK: {"event":"keepalive","time":1630.0073155}
2020-08-25 03:37:32.687 INFO Scripting: event:type=test,initiator=George Washington,place=Washinton,
2020-08-25 03:37:31.008 INFO Panda HOOK: {"event":"keepalive","time":1635.0086481}
2020-08-25 03:37:32.687 INFO Scripting: event:type=test,initiator=Abe Lincoln,place=Washinton,
2020-08-25 03:37:21.001 INFO Panda HOOK: {"event":"keepalive","time":1625.0011002}
2020-08-25 03:37:26.007 INFO Panda HOOK: {"event":"keepalive","time":1630.0073155}
2020-08-25 03:37:31.008 INFO Panda HOOK: {"event":"keepalive","time":1635.0086481}
2020-08-25 03:37:34.414 INFO Scripting: event:type=test2,t=25277.04,type=comment,
2020-08-25 03:37:21.001 INFO Panda HOOK: {"event":"keepalive","time":1625.0011002}
2020-08-25 03:37:26.007 INFO Panda HOOK: {"event":"keepalive","time":1630.0073155}
2020-08-25 03:37:31.008 INFO Panda HOOK: {"event":"keepalive","time":1635.0086481}
2020-08-25 03:37:34.414 INFO Scripting: event:type=test2,t=25277.04,type=comment,
2020-08-25 03:37:21.001 INFO Panda HOOK: {"event":"keepalive","time":1625.0011002}
2020-08-25 03:37:26.007 INFO Panda HOOK: {"event":"keepalive","time":1630.0073155}
2020-08-25 03:37:31.008 INFO Panda HOOK: {"event":"keepalive","time":1635.0086481}
2020-08-25 03:37:32.687 INFO Scripting: event:type=test,initiator=Alex Hamilton,place=Washinton,
2020-08-25 03:37:21.001 INFO Panda HOOK: {"event":"keepalive","time":1625.0011002}
2020-08-25 03:37:26.007 INFO Panda HOOK: {"event":"keepalive","time":1630.0073155}
2020-08-25 03:37:31.008 INFO Panda HOOK: {"event":"keepalive","time":1635.0086481}
2020-08-25 03:37:34.414 INFO Scripting: event:type=test2,t=25277.04,type=comment,
代码
seen_test = False # state variable for keeping track of what you have done
init_person = None # note snake_case variable convention pro headlessCamelCase
with open('data.log', 'r') as f:
for lineno, line in enumerate(f, start=1):
if 'event:type=test,' in line:
if seen_test:
raise ValueError(
'line %i: type=test without test2: %s' % (
lineno, line))
init_person = line.split('initiator=')[1].split(',')[0]
seen_test = True
elif 'event:type=test2' in line:
if seen_test:
# ... do whatever you want with init_person
# maybe something like
result = line.rstrip('\n').split(',')
print('Test by %s got results %s' % (init_person, result[1:]))
else:
raise ValueError(
'line %i: type=test2 without test: %s' % (
lineno, line))
seen_test = False