Python日志解析

时间:2014-07-31 11:36:18

标签: python string parsing iteration

我是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

多个日志条目位于同一行,未用&#34; \ n&#34;分隔。 日志条目以格式&lt; 20&gt;开头。 ......&lt; 21&gt; ......他们都在同一条线上。

如何迭代不同的编号标签,然后为每次迭代提取以下信息:

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

source-address = 192.168.30.170

source-port = 55256

2 个答案:

答案 0 :(得分:2)

通过阅读您的示例日志,我可以看到您确实在每一行上都有多个日志条目,每个日志条目都包含多个字段。

如何从文件中读取数据是一个选择的问题,并且取决于这些日志对于内存是否太大而言有多大,我个人会打开文件然后逐行处理它使用file.readline()

然后如果你使用&lt;分割每个文件作为分隔符 - 例如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',
]
]

如您所见,这将返回一个列表列表,每个子列表被分解为单个日志条目中包含的各个字段。

所以现在你所要做的就是从每个列表中提取你想要的位,如果日志总是采用相同的形式,你只需使用索引即可,但更强大的方法可以做到这一点通过匹配字符串。

答案 1 :(得分:-1)

  1. 逐行阅读文件
  2. 按分隔符分割线条,看起来像'&gt;'可以是分隔符
  3. 拆分每一行,然后添加您的收藏品
  4. 非常简短的例子:

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

    对于更复杂的解析,我会使用正则表达式(re module)。

相关问题