将字符串解析为属性包并循环其键以在扩展列中显示其值



我正在摄取一个日志,最终把很多好的数据放在" 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)
<表类>操作SrcIpAddrSrcPortNumber用户tbody><<tr>允许192.168.1.14664694test.test@test.com否认192.168.1.14764695test.test@test2.com允许192.168.1.14864696test.test@test3.com

相关内容

  • 没有找到相关文章

最新更新