含变量的Splunk Cloud查询无结果问题排查求助
解决Splunk变量与字段匹配无结果的问题
我一眼就看出问题所在了——你在where和search命令里错误地给字段名加了双引号!这会让Splunk把"ExtendedProperties.ProductVersion"当成一个字符串字面量,而不是去引用这个字段的实际值,自然永远匹配不上你生成的变量。
错误根源分析
比如你原来的查询:
"ExtendedProperties.PrCode"="myProductName" | eval myversion="12.916"| where "ExtendedProperties.ProductVersion"=myversion
这里的"ExtendedProperties.ProductVersion"是字符串,Splunk会拿它和myversion的值"12.916"做比较——显然"ExtendedProperties.ProductVersion"不等于"12.916",所以没有结果。
修正后的基础查询
把字段名的双引号去掉(如果字段名有特殊字符,用单引号包裹也可以),就能正常匹配:
"ExtendedProperties.PrCode"="myProductName" | eval myversion="12.916"| where ExtendedProperties.ProductVersion = myversion
或者用单引号包裹字段名(适合字段名含空格/特殊字符的场景):
"ExtendedProperties.PrCode"="myProductName" | eval myversion="12.916"| where 'ExtendedProperties.ProductVersion' = myversion
实现动态版本号的最终查询
针对你用now()生成当日版本号的需求,修正后的完整查询如下:
"ExtendedProperties.PrCode"="myProductName" | eval month = ltrim(tostring(strftime(now(),"%m")),"0") | eval day = strftime(now(),"%d") | eval version = "12." + month + day | where ExtendedProperties.ProductVersion = version
验证你的测试用例
针对你提供的makeresults测试查询,修正后也能正常返回结果:
| makeresults | eval _raw = "{\"Timestamp\":\"2020-12-14T14:37:00.2662745Z\",\"Categories\":[\"someCategoryString\"],\"Metadata\":[\"someMetadataString\"],\"ExtendedProperties\":{\"MachineId\":\"SomeMachineId\",\"ProductVersion\":\"12.1219\",\"PrCode\":\"MyProductName\",\"ProductType\":\"1\",\"Type\":\"ProductUsed\",\"Source\":\"SomeSourceString\",\"SessionId\":\"SomeGuid\",\"TimeStamp\":\"2020-12-14T14:36:56.7086819Z\",\"Environment\":\"SomeEnvironment\"}}", month = ltrim(tostring(strftime(now(),"%m")),"0"), day = strftime(now(),"%d"), version = "12." + month + day | spath | search ExtendedProperties.ProductVersion = version
这样就能正确匹配到ProductVersion为12.1219的记录(当当前日期是12月19日时)。
额外提示
- Splunk中,
where和search命令引用字段时,不要给字段名加双引号,双引号会将其转为字符串常量; - 如果字段名包含空格、特殊字符(如
-),可以用单引号'包裹字段名; - 你生成版本号的逻辑是对的:
ltrim处理月份去掉前导零,日期保留两位,拼接后正好匹配数据中的格式。
内容的提问来源于stack exchange,提问作者K. B.




