我是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
答案 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)
非常简短的例子:
for log in open('my.log').readlines():
for line in log.split('>'):
data = line.split()
print(data)
对于更复杂的解析,我会使用正则表达式(re module)。