将字符串解析为属性包并遍历其键以在扩展列中显示其值
Posted
技术标签:
【中文标题】将字符串解析为属性包并遍历其键以在扩展列中显示其值【英文标题】:Parse string into property bag and loop through its keys to display its values in an extended column 【发布时间】:2021-11-20 13:19:01 【问题描述】:我正在摄取一个日志,该日志最终在“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 个字段,我希望对重要的日志进行彻底的检查要停顿,更不用说必须返回 7 天或更长时间,KQL 在时间返回时失败了很多,当然不像 Splunk,但我现在正在开发这个产品。
【问题讨论】:
【参考方案1】:理想情况下,您将调整源以使用受支持的标准格式(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)
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 |
【讨论】:
这是一个超级棒、简洁的解决方案,谢谢!我注意到你为微软员工做了很多工作,继续努力!以上是关于将字符串解析为属性包并遍历其键以在扩展列中显示其值的主要内容,如果未能解决你的问题,请参考以下文章
将 JSON 反序列化为 C# 对象以在网格中将嵌套数组显示为字符串