下面,我粘贴了我们连续收到的日志(流式传输)。我需要提取并解析它们。
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个属性。
如果用逗号分割字符串,则可以忽略第一个标记。其余标记是用等号分隔的属性/值对。
您可以编写 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'}
你的意思是这个吗?
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
顺便说一句,我不确定我是否正确解释了日期时间字符串。