我正在摄取一个日志,最终把很多好的数据放在" additionalextension "字段。这是一个数据示例:
Action =允许;用户= test.test@test.com; SrcIpAddr = 192.168.1.146; SrcPortNumber = 64694
我想弄清楚是否有一种方法,一旦我分裂(AdditionalExtensions,";")将split()函数产生的字符串数组转换为属性包,然后循环通过它的键,在python中将是什么:
for k,v in mydict:
print(f'{k}= {v}')
但我当然必须扩展其关键到例如,行动,用户,SrcIpAddr, SrcPortNumber所以我可以最终类似:
| extend Action = loopThrough1stIteminDict[v],
User = loopThrough2ndIteminDict[v]
| project Action, User
和最终的结果是:
Action User
Allow test.test@test.com
如果不可能,那么在KQL中使用什么更有效呢?
| extend parser = split(AdditionalExtensions,";")
| extend Action = extract("=(.*)",1,tostring(parser[0])),
或者不是使用extract(),而是使用substring(),而是使用indexof()来告诉子字符串我想从等号所在的索引开始,并到字符串的末尾
在AdditionalExtensions字段中大约有30-40个字段,我希望为一个重要的日志做这个彻底的工作,我可能需要回到很多时间,我不希望一个查询回到2小时停滞,更不用说回到7天或更长时间,KQL在回到时间时失败了很多,当然不像Splunk,但我现在正在研究这个产品。
理想情况下,您将调整源代码,使其以受支持的标准格式(JSON)编写半结构化数据,而不是以分号/等号分隔的键值对。这将允许您避免在查询原始数据时对其进行低效的查询时解析。
忽略性能和效率,您仍然可以实现这样的解析:datatable (s:string)
[
'Action=Allow;User=test.test@test.com;SrcIpAddr=192.168.1.146;SrcPortNumber=64694',
'Action=Deny;User=test.test@test2.com;SrcIpAddr=192.168.1.147;SrcPortNumber=64695',
'Action=Allow;User=test.test@test3.com;SrcIpAddr=192.168.1.148;SrcPortNumber=64696'
]
| mv-apply s = split(s, ";") on (
parse s with key "=" value
| summarize b = make_bag(pack(key, value))
)
| evaluate bag_unpack(b)