将字符串解析为 属性 包并遍历其键以在扩展列中显示其值
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
我正在摄取一个日志,最终在“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 |