使用Python解析日期时间范围之间的日志

时间:2019-04-26 11:54:50

标签: python regex datetime parsing logging

我正在尝试创建动态函数:我提供了两个datetime值,它可以读取这些datetime值之间的日志,例如:

    start_point = "2019-04-25 09:30:46.781"
    stop_point =  "2019-04-25 10:15:49.109"

我正在考虑检查的算法:

  1. 如果日期相等:
    • 检查开始时间0个字符(09-> 0)是否高于或小于停止时间0个字符(10-> 1);
    • 用小时1个字符进行相同检查((开始)09-> 9,(停止)10-> 0);
    • 以分钟0个字符进行同样的检查;
    • 以1个字符的分钟进行相同的检查;
  2. 如果日期不同:
    • 其他一些检查...

我不知道我是否不会再发明一个轮子,但我真的迷失了,我将列出我尝试过的事情:

1。

    ...
    cmd = subprocess.Popen(['egrep "2019-04-19 ([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9].[0-9]{3}" file.log'], shell=True, stdout=subprocess.PIPE)
    cmd_result = cmd.communicate()[0]
    for i in str(cmd_result).split("\n"):
        print(i)
    ...

这个问题:我添加了示例中的值,但它不起作用,因为它具有无效的范围,例如小时1个字符,它也会创建范围[9-0],分钟也为0 [3-1] ]等。

2。 从The best way to filter a log by a dates range in python

尝试了以下解决方案

感谢您的帮助。

编辑

日志行结构:

    ...
    2019-04-25 09:30:46.781 text text text ...
    2019-04-25 09:30:46.853 text text text ...
    ...

编辑2

所以我尝试了代码:

from datetime import datetime as dt

s1 = "2019-04-25 09:34:11.057"
s2 = "2019-04-25 09:59:43.534"

start = dt.strptime('2019-04-25 09:34:11.057','%Y-%m-%d %H:%M:%S.%f')
stop = dt.strptime('2019-04-25 09:59:43.534', '%Y-%m-%d %H:%M:%S.%f')

start_1 = dt.strptime('09:34:11.057','%H:%M:%S.%f')
stop_1 = dt.strptime('09:59:43.534','%H:%M:%S.%f')

with open('file.out','r') as file:
    for line in file:
        ts = dt.strptime(line.split()[1],'%H:%M:%S.%f')
        if (ts > start_1) and (ts < stop_1):
            print line

我得到了错误

ValueError: time data 'Platform' does not match format '%H:%M:%S.%f'

所以看来我发现了另一个问题,它有时在行开始时包含非日期时间。有没有办法提供我提供日期时间格式的正则表达式?

编辑3

解决了当字符串出现在行首时导致ValueError和可能超出其他值的固定索引超出范围错误的问题:

try:
    ts = dt.strptime(line.split()[1],'%H:%M:%S.%f')
    if (ts > start_1) and (ts < stop_1):
        print line
except IndexError as err:
    continue
except ValueError as err:
    continue

所以现在它列出的列表不在我提供的范围内,现在它读取了日志 从2019-02-27 09:38:46.2292019-02-28 09:57:11.028。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您的编辑2的想法正确。您需要进行异常处理以捕获格式不正确的行,并跳过它们,例如空白行或没有时间戳的行。可以按照以下步骤进行操作:

from datetime import datetime

s1 = "2019-04-25 09:24:11.057"
s2 = "2019-04-25 09:59:43.534"

fmt = '%Y-%m-%d %H:%M:%S.%f'

start = datetime.strptime(s1, fmt)
stop = datetime.strptime(s2, fmt)


with open('file.out', 'r') as file:
    for line in file:
        line = line.strip()

        try:
            ts = datetime.strptime(' '.join(line.split(' ', maxsplit=2)[:2]), fmt)

            if start <= ts <= stop:
                print(line)

        except:
            pass

整个时间戳都用于创建ts,因为它可以与startstop正确比较。每行首先删除尾随的换行符。它是最多分割两次的空格。然后将前两个拆分重新结合在一起,并转换为datetime对象。如果失败,则表明您的行格式不正确。