如何找到最近时间戳的日志行?

时间:2018-07-18 17:52:55

标签: regex python-3.x comparison

当前,我正在循环浏览目录,以查找/存储/显示包含版本号信息的最新日志行。我正在使用Regex查找带有版本号的日志行,并且试图通过将它们与parse_version进行比较来查找具有最新时间戳的日志行。

例如,我的文件夹文件中的日志行如下所示:

2018-05-08T15:47:27.752Z 00000000-0000-0000-0000-000000000000 > LVL:2 RC: version: 2.12.1.10452

2018-05-08T21:27:14.2049217Z> <INFO >: Version: 2.10.0.23960

2018-05-08T21:18:53.0428568Z> <INFO >: Version: 2.12.1.26051

这些只是我的文件夹文件中成千上万行日志的几个示例,我正在尝试查找包含有关版本号的信息的最新日志行。在这种情况下,我希望选择第二行,即使它的版本号较低,因为它具有更新的时间戳。

下面是我的代码,为简单起见,我没有包括遍历文件夹的代码。

            for line in f: #For simplicity sake, I won't include my code above this line because it's just for looping through the folder to find the log lines
            #0strip out \x00 from read content, in case it's encoded differently
            line = line.replace('\x00', '')

            #Regular expressions for finding the log lines in the folder
            RE2 = r"^.+INFO.+Version.+"
            RE3 = r"^.+RC: version"

            previous_version_line = '0'
                version_to_display = '00'
                #Find the general matches, and get the version line with the latest time stamp
                pattern2 = re.compile('('+RE2+'|'+RE3+')', re.IGNORECASE)
                for match2 in pattern2.finditer(line):

                    if parse_version(line) > parse_version(previous_version_line):
                        version_to_display = line
                        previous_version_line = line
                    else:
                        version_to_display = previous_version_line

                    print(version_to_display)

现在,问题似乎出在parse_version比较中,尽管通过正则表达式找到的日志行的值应大于0,但if语句始终求值为false,而我只是打印一堆0。 / p>

谢谢!

1 个答案:

答案 0 :(得分:0)

找到其中包含“版本”的每一行,按时间对其进行排序,并在日志消息中显示最新时间:

data = """
2018-05-08T15:47:27.752Z 00000000-0000-0000-0000-000000000000 > LVL:2 RC: version: 2.12.1.10452

2018-05-08T21:27:14.2049217Z> <INFO >: Version: 2.10.0.23960

2018-05-08T21:18:53.0428568Z> <INFO >: Version: 2.12.1.26051
"""

import re
from datetime import datetime

data_new = []
for (d, log) in re.findall(r'([\d\-:T\.]+Z)>?\s+(.*)', data):
    if not re.search('version', log, flags=re.I):
        continue
    parts = d.split('.')
    if len(parts[1]) >= 8:
        d = parts[0] + '.' + parts[1][:6] + 'Z'
    data_new.append((datetime.strptime(d, '%Y-%m-%dT%H:%M:%S.%fZ'), log))

data_new = sorted(data_new, reverse=True)
if data_new:
    t = data_new[0][0].strftime('%Y-%m-%dT%H:%M:%S.%fZ')
    print(f'Latest version to display:\ntime=[{t}] msg=[{data_new[0][1]}]')

打印:

Latest version to display:
time=[2018-05-08T21:27:14.204921Z] msg=[<INFO >: Version: 2.10.0.23960]

注意事项:

Python datetime类仅接受6位数的微秒(因此该程序将其截断)。