Python解析日志文件以获取数据对

时间:2020-09-01 21:39:29

标签: python-3.x

在另一个问题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

0 个答案:

没有答案