在python中从日志文件中检索记录持续n秒

时间:2018-08-28 05:33:50

标签: python file logging

我要忽略“未找到:/ api”,并在输入的最后n秒内返回所有GET和POST调用

以下是我的日志文件的外观:

Not Found: /api
[22/Aug/2018 10:07:14] "GET /api HTTP/1.1" 404 2318
Not Found: /api
[22/Aug/2018 10:30:30] "GET /api HTTP/1.1" 404 2318
Not Found: /api
[22/Aug/2018 10:30:33] "GET /api HTTP/1.1" 404 2318
[22/Aug/2018 10:37:08] "POST /api/entity/ HTTP/1.1" 201 83
[22/Aug/2018 10:37:40] "GET /api/entity/ HTTP/1.1" 200 412
[22/Aug/2018 10:37:41] "POST /api/datasets/ HTTP/1.1" 201 115

2 个答案:

答案 0 :(得分:0)

如果您使用的是尾巴:

tail somelog.log | grep -E 'GET|POST'

您也许还可以使用egrep:

tail somelog.log | egrep 'GET|POST'

您还可以cat日志文件并通过管道传递相同的egrepgrep -E命令。

答案 1 :(得分:0)

编辑:

由于日志文件中有几行多余的行,不仅是“未找到...”,我还假设所有有效行都以方括号开头,例如上面的日期行。

首先,我将所有有效的行读入列表:

log = []
with open ('/wherever/file/may/roam/logfile.log', 'r') as logfile:
    for row in logfile.readlines():
        if row[0] == '[':
            log.append(row)

使用StringIO模块中的io,您可以将其输入到熊猫的数据帧创建中:

from io import StringIO
df = pd.read_fwf(StringIO(''.join(log)), colspecs=[(1, 21), (23, None)], header=None)

您可以在这样的数据框中使用pandas读取此日志文件

将熊猫作为pd导入 df = pd.read_fwf('/ whereever / file / may / roam / logfile.log',colspecs = [(1,21),(23,None)],comment ='o',header = None)

在这里我使用“读取固定宽度的文件”,因为开始时的长度是等长的。我已经通过读取(colspecs)上的第二个字符来切掉括号,因此要通过comment关键字跳过的行的信号字符是'Not'的'o'。称它为滥用,但在这里效果很好。那么header=None是因为您的文件没有第一行的列描述符。

结果是此数据框:

df
                      0                                       1
0  22/Aug/2018 10:07:14            "GET /api HTTP/1.1" 404 2318
1  22/Aug/2018 10:30:30            "GET /api HTTP/1.1" 404 2318
2  22/Aug/2018 10:30:33            "GET /api HTTP/1.1" 404 2318
3  22/Aug/2018 10:37:08     "POST /api/entity/ HTTP/1.1" 201 83
4  22/Aug/2018 10:37:40     "GET /api/entity/ HTTP/1.1" 200 412
5  22/Aug/2018 10:37:41  "POST /api/datasets/ HTTP/1.1" 201 115

使用

df[0] = pd.to_datetime(df[0])

我们将字符串类型的日期转换为可用于计算的日期时间格式。
然后,我们需要一个函数来从最后一个条目算起n秒:

thrshld = lambda n: df[0].values[-1] - n*10**9

df [0]中的datetime值为numpy.datetime64类型,其分辨率为纳秒,因此系数为10 ** 9。

现在您可以像索引数据框一样

df[df[0]>thrshld(5)]
Out: 
                    0                                       1
4 2018-08-22 10:37:40     "GET /api/entity/ HTTP/1.1" 200 412
5 2018-08-22 10:37:41  "POST /api/datasets/ HTTP/1.1" 201 115

df[df[0]>thrshld(60)]
Out: 
                    0                                       1
3 2018-08-22 10:37:08     "POST /api/entity/ HTTP/1.1" 201 83
4 2018-08-22 10:37:40     "GET /api/entity/ HTTP/1.1" 200 412
5 2018-08-22 10:37:41  "POST /api/datasets/ HTTP/1.1" 201 115