Python 中检索日志属性的最有效方法 |用逗号分隔

问题描述 投票:0回答:2

下面,我粘贴了我们连续收到的日志(流式传输)。我需要提取并解析它们。

Log1 =“2024-04-03T09:51:17+0000 logType,xyz=appliance1,xyz1=HR,action=allow,applianceId=1,xyz4=2,xyz5=3,依此类推...”

Log2 =“2024-04-03T09:51:17+0000 logType,xyz=appliance1,xyz1=HR,action=allow,applianceId=1,xyz4=2,xyz5=3,依此类推...”

Log3 =“2024-04-03T09:51:17+0000 logType,xyz=appliance1,xyz1=HR,action=allow,applianceId=1,xyz4=2,xyz5=3,依此类推...”

Log4 =“2024-04-03T09:51:17+0000 logType,xyz=appliance1,xyz1=HR,action=allow,applianceId=1,xyz4=2,xyz5=3,依此类推...”

我使用 split 所做的一种解析日志的有效方法是什么,

def parse(log):
    values = log.split(',')
    for v in values:
        //do it here

def main():
   parse(log1)
   parse(log2)
   parse(log3)
   parse(log4)

注1:每个日志(log1、log2...)都需要特定的属性值。例如,我需要每个日志中的属性 xyz、zyz2 和 xyz5 的值。

注2:这只是一个小例子,但每个日志可能有超过20到30个属性。

python regex bigdata streaming logparser
2个回答
0
投票

如果用逗号分割字符串,则可以忽略第一个标记。其余标记是用等号分隔的属性/值对。

您可以编写 parse() 函数来返回一个字典,其中键是属性名称,值是属性值。

然后您可以处理字典来更新数据库。

类似这样的:

Log1 = "2024-04-03T09:51:17+0000 logType, xyz=appliance1, xyz1=HR, action=allow, applianceId=1, xyz4=2, xyz5=3"

def parse(s):
    def genattrs(attrs):
        for attr in attrs:
            a, v = attr.split("=")
            yield a.lstrip(), v
 
    return dict(genattrs(s.split(",")[1:]))

print(parse(Log1))

输出:

{'xyz': 'appliance1', 'xyz1': 'HR', 'action': 'allow', 'applianceId': '1', 'xyz4': '2', 'xyz5': '3'}

0
投票

你的意思是这个吗?

from datetime import datetime
def parse(log):
    values=log.split(', ')
    date_and_type=values.pop(0).split(' ',1)
    result={
        'date':datetime.strptime(date_and_type[0],'%Y-%m-%dT%H:%M:%S+%f'),
        'logtype':date_and_type[1]
    }
    for v in values:
        knv=v.split('=',1)
        result[knv[0]]=knv[1]
    return result

顺便说一句,我不确定我是否正确解释了日期时间字符串。

© www.soinside.com 2019 - 2024. All rights reserved.