从logfi获取时间戳

2024-06-12 07:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个代码,它使用给定的regex模式读取目录中多个日志文件的所有行:

代码如下:

src_dict = ("/nfs/home/dex/work/xxx/xxx/logs")
pattern = re.compile ('(.*)for exports(.*)')

for passed_files in os.listdir(src_dict):
    files = os.path.join(src_dict, passed_files)
    strng = open(files)
    for lines in strng.readlines():
        if re.search(pattern, lines):
            print lines

上面的代码给出了日志文件中所有必需的行,每行末尾都有一个时间戳

./xx.xx.xx.v1.0_Final:2019-01-30 08:34:46.463 -0800 INFO [626] - Program Ended: xx::xx::xxx::xx for exports [... stuff ...] after 00:26:15

……等等

现在我想获取包含时间戳的所有最后一行,即00:26:15(它可能总是不同的) 并计算从这些日志文件收集的所有时间戳的总时间和平均时间


Tags: 文件代码inresrcfor时间files
1条回答
网友
1楼 · 发布于 2024-06-12 07:40:19

只需添加时间戳1-就可以使用正则表达式了。

为此,请使用"capture groups"

要获得格式为HH:MM:SS的数字,您有两个数字,一个冒号,两个数字,另一个冒号和另外两个数字。量化它就是hard,所以你可能会这样写:

(\d\d):(\d\d):(\d\d)(如果你想的话,你可以{2}那些\d,但对我来说似乎更复杂)

请注意数字匹配器周围的括号:它们告诉re分别捕获内容,并将其作为match.group(number)提供,从1开始,match.groups(),一个元组。为了确保匹配行的结束(不在中间),您添加了$(严格地说,这应该不是必需的,因为.*id“greedy”,但更清楚)

如果你把它添加到你的正则表达式中,(如果你不需要的话,删除你已经有的组;否则,你会得到:

pattern = re.compile(r'.* for exports .* (\d\d):(\d\d):(\d\d)$')

现在,您可以匹配它并获得每次跑步的时间,如下所示: match = pattern.match(logline); seconds = (int(match.group(1))*60 + int(match.group(2))) * 60 + int(match.group(3)


我说过上面的量化很难,但它可以做到,我知道有两个步骤: 首先获取所有时间戳,然后分别处理。在这种情况下,增加的复杂性太多了,但是,如果您有不同的情况,最好记住:

.*((?:\d{2}:)+\d\d)$捕获由冒号分隔的任意长度的两个数字,然后可以对其进行简化.split(':')并执行计算


它通常指的是specific point in time,而不是持续时间。为了不把你弄糊涂,我在回答中用了“时间戳”。日志输出中的实际时间戳是2019-01-30 08:34:46.463,而不是00:26:15

相关问题 更多 >