我的公司已开始使用 JSON 日志记录,以便更好地支持 AWS 上的 CloudWatch InSights 查询。除了处理数组数据时,查询相当容易使用。
例如,如果我们有如下日志条目:
{
"id": 123,
"method": "getRelatedPolicies",
"policiesRetrieved": [
"333g",
"444q"
]
}
{
"id": 222,
"method": "getRelatedPolicies",
"policiesRetrieved": [
"123q",
"234w",
"345e",
"456r"
]
}
{
"id": 432,
"method": "getRelatedPolicies",
"policiesRetrieved": [
"345e"
]
}
它们在 CloudWatch Insights 中呈现扁平状,如下所示:
id 123,
method getRelatedPolicies
policiesRetrieved.0 333g
policiesRetrieved.1 444q
id 222,
method getRelatedPolicies
policiesRetrieved.0 123q
policiesRetrieved.1 234w
policiesRetrieved.2 345e
policiesRetrieved.3 456r
id 432,
method getRelatedPolicies
policiesRetrieved.0 345e
但是,我该怎么做才能搜索其中的 strategiesRetrieved 数组包含值 的任何日志条目345e
?数组中可能有任意数量的条目,因此我不能直接开始添加像这样的过滤行or policiesRetrieved.0 = "345e" or policiesRetrieved.1 = "345e"...
。
如果我可以将所有值折叠成一个分隔字符串,那么我就可以在字符串中搜索匹配项,另外,如果用户将数据导出为 CSV 或其他非 AWS 格式以供进一步分析,我还可以轻松使用该列表。
我能否以某种方式将数组值解析为字符串?我查看了查询中可用的所有辅助函数,但没有一个可行的。
任何解决方案都将受到赞赏。
答案1
因此,针对我的情况,解决方案非常简单,因为所讨论的数组仅包含字符串。我只是将数组的内容解析为单个字符串。这适用于字符串、数字或布尔值的[
数组]
。如果我想提取对象数组的 ID,那就没那么好了。
无论如何,这里有一个解析数组中的字符串的示例查询:
fields @timestamp, id, method # you don't need to put the 'policyNumbers' up here - it is added automatically
| parse @message '"policyNumbers":[*]' as policyNumbers
#| filter policyNumbers like '234w' # Uncomment to show only entries that mention a specific policy
这将解析以下行:
{"timestamp":"2020-07-21T12:03:46.970Z","id":222,"method": "getRelatedPolicies","dataAccess":{"policyNumbers":["123q", "234w", "345e", "456r"]}}}
具有、和的值id
222
method
getRelatedPolicies
policyNumbers
"123q", "234w", "345e", "456r"