【问题标题】:How to extract data from array in a JSON message using CloudWatch Logs Insights?如何使用 CloudWatch Logs Insights 从 JSON 消息中的数组中提取数据?
【发布时间】:2021-11-11 07:37:17
【问题描述】:

我记录的是 JSON 对象的消息。 JSON 有一个包含键/值对的数组:

{
   ...
   "arr": [{"key": "foo", "value": "bar"}, ...],
   ...
}

现在我想过滤包含特定键的结果并提取数组中特定键的值。

我尝试过使用正则表达式,例如parse @message /.*"key":"my_specific_key","value":(?<value>.*}).*/,它提取值但也返回消息的其余部分。它也不会过滤结果。

如何过滤结果并提取特定键的值?

【问题讨论】:

    标签: amazon-cloudwatch aws-cloudwatch-log-insights


    【解决方案1】:

    如果在 cloudwatch 日志组的日志条目中,它们实际上显示为 json,您可以直接在任何需要字段的位置引用密钥。

    (不需要@,cloudwatch 会自动将其附加到所有默认值)

    如果您使用的是 python,您也可以使用 aws_lambda_powertools 以非常巧妙的方式执行此操作(并且它是一个实际的 aws 产品)

    如果它们在您的日志中显示为字符串,那么它可能是一个转义字符串,您必须完全匹配它 - 包括空格等等。当你解析时,你会想要做这样的事情:

    如果这是您的日志消息的字符串 '{"AKey" : "AValue", "Key2" : "Value2"}

    parse @message "{\"*\" : \"*\",\"*\" : \"*\"} akey, akey_value, key2, key2_value
    

    然后您可以过滤或计数或针对这些变量进行任何操作。 parse 特别是一个匹配模式并将通配符分配给变量的语句,一次一个,按顺序

    如果您使用了复杂的 json,如果您的上述正则表达式有效,那么您只需要一个过滤器语句

    field @message
     | pares @message ... your regex as value_var
     | filer value_var /some more regex/
     
    

    如果它不是日志条目中的字符串,而是一个实际的 json,您可以直接引用密钥:

    filter a_key ~="some value" (or regex here)
    

    https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html

    更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 2020-11-20
      • 1970-01-01
      • 2022-09-28
      • 2021-07-04
      • 2021-06-15
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多