Python日志解析

0 投票
2 回答
813 浏览
提问于 2025-04-18 15:29

我刚开始学习在Python中解析数据。我有一个日志文件,格式如下:

<20>1 2008-12-18T09:46:28.806-07:00 NET-RT - RT_FLOW_CREATE [os@2243.1.1.1.2.43 source-address="192.168.30.170" source-port="55256"] vlan.192 <21>1 2008-12-18T09:46:28.806-07:00 NET-RT - RT_FLOW_CREATE [os@2243.1.1.1.2.43 source-address="192.168.30.170" source-port="55256"] vlan.192

这些日志条目都在同一行上,没有用"\n"分开。每个日志条目都是以<20> ... <21> ...这样的格式开始的,而且它们都在同一行里。

我想知道怎么逐个处理这些不同编号的标签,然后在每次处理时提取以下信息:

时间 = 2008-12-18T09:46:28.806-07:00

源地址 = 192.168.30.170

源端口 = 55256

2 个回答

-1
  1. 逐行读取文件
  2. 根据分隔符拆分每一行,似乎'>'可以作为分隔符
  3. 拆分每一行,并把结果添加到你的集合中

这是一个非常简单的例子:

for log in open('my.log').readlines():
  for line in log.split('>'):
    data = line.split()
    print(data)

如果需要更复杂的解析,我会使用正则表达式(re模块)。

2

从你提供的日志样本来看,每一行确实有多个日志条目,每个条目都有几个字段。

你如何从文件中读取数据其实是个选择问题,主要取决于这些日志的大小,看看它们是否会占用太多内存。个人建议是打开文件,然后逐行处理,使用 file.readline()

接着,如果你用 < 作为分隔符来拆分每一行,比如 line.split("<"),这样就可以根据条目的数量把每一行拆分成几个部分。

然后你可以对每个部分再用空格进行拆分,使用空格作为分隔符,比如 part.split()

以你的日志样本为例,这样做会得到:

[
[
'20>1', # first sub list
'2008-12-18T09:46:28.806-07:00',
'NET-RT',
'-',
'RT_FLOW_CREATE',
'[os@2243.1.1.1.2.43',
'source-address="192.168.30.170"',
'source-port="55256"]',
'vlan.192'
],
[
'21>1', # second sub list
'2008-12-18T09:46:28.806-07:00',
'NET-RT',
'-',
'RT_FLOW_CREATE',
'[os@2243.1.1.1.2.43',
'source-address="192.168.30.170"',
'source-port="55256"]',
'vlan.192',
]
]

如你所见,这样返回的是一个列表的列表,每个子列表都被拆分成了单个字段,这些字段都在一个日志条目里。

现在你只需要从每个列表中提取你想要的部分。如果日志的格式总是一样的,你可以简单地用索引来提取,但更稳妥的方法是通过匹配字符串来实现。

撰写回答