0

我正在摄取一个日志,最终在“AdditionalExtensions”字段中放置了很多好的数据。这是一个数据示例:

操作=允许;用户=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,但我现在正在开发这个产品。

4

1 回答 1

3

理想情况下,您将调整源以使用受支持的标准格式(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)
行动 源地址 源端口号 用户
允许 192.168.1.146 64694 test.test@test.com
否定 192.168.1.147 64695 test.test@test2.com
允许 192.168.1.148 64696 test.test@test3.com
于 2021-09-28T14:43:36.150 回答