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

Parse string into property bag and loop through its keys to display its values in an extended column

我正在摄取一个日志,最终在“AdditionalExtensions”字段中放入了大量有用的数据。 这是数据示例:

Action=Allow;User=test.test@test.com;SrcIpAddr=192.168.1.146;SrcPortNumber=64694

我想知道是否有办法,一旦我 split(AdditionalExtensions,";") 将 split() 函数生成的字符串数组转换为 属性 包,并且然后遍历它的键,在 python 中的排序是:

for k,v in mydict:
  print(f'{k}= {v}')

但当然我必须将它的密钥扩展到例如 Action、User、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 - 而不是 semicolon/equals-sign-separated 键值对。这将允许您在查询时避免对原始数据进行低效的查询时解析。

抛开性能和效率,你仍然可以实现这样的解析:

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)
Action SrcIpAddr SrcPortNumber User
Allow 192.168.1.146 64694 test.test@test.com
Deny 192.168.1.147 64695 test.test@test2.com
Allow 192.168.1.148 64696 test.test@test3.com