Splunk使用spath查询JSON数组时如何匹配单元素多条件
问题根因
你当前的查询逻辑是判断整个appliedConditionalAccessPolicies数组中存在任意元素的displayName等于policy1,且存在任意元素的result等于failure,两个条件不需要作用在同一个元素上,所以第二条事件因为policy2的result是failure也会被命中,导致返回结果不符合预期。
解决方案
有两种常用的实现方式,按需选择即可:
方案1:数组元素拆行匹配(适合需要后续分析单个策略属性的场景)
index=test # 提取整个条件访问策略数组到多值字段policy | spath path="appliedConditionalAccessPolicies{}" output=policy # 将数组的每个元素拆分为独立的单行事件 | mvexpand policy # 从单个策略对象中提取名称和结果字段 | spath input=policy path=displayName output=policy_name | spath input=policy path=result output=policy_result # 匹配同一策略同时满足两个条件的行 | search policy_name="policy1" policy_result="failure" # 可选:按原始事件去重,避免同一事件多个匹配策略返回重复结果 | stats values(*) as * by _raw
方案2:多值字段绑定匹配(适合仅做筛选的场景,性能更高)
index=test # 分别提取所有策略名称和结果为两个多值字段,字段顺序和数组元素顺序一一对应 | spath "appliedConditionalAccessPolicies{}.displayName" output=policy_names | spath "appliedConditionalAccessPolicies{}.result" output=policy_results # 按顺序将两个多值字段的元素配对,拼接为「名称=结果」格式的多值字段 | eval policy_pair = mvzip(policy_names, policy_results, "=") # 直接搜索配对后的字段中存在符合要求的组合即可 | search policy_pair="policy1=failure"
内容的提问来源于stack exchange,提问作者Ashish Gupta
相关产品推荐
相关产品推荐

