在JSON属性名称中搜索具有特殊字符的AWS CloudWatch Logs

Emp*_*nal 10 amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs

我们使用AWS CloudWatch Logs调试在AWS上运行的服务,我们日志中的许多属性名称使用冒号作为分隔符,但我们无法弄清楚如何使用这些属性名称进行搜索.

这是一个日志的例子:

{
  "Counts": {
    "RouteHandler:GetCookies": {
      "value": 1
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

使用控制台,我尝试过这样的查询:

{ $.Counts.RouteHandler:GetCookies.value = 1 }
Run Code Online (Sandbox Code Playgroud)

当然,特殊字符通常在查询语言中具有特定用途,因此我试图以某种方式逃避它.

{ $.Counts.RouteHandler\:GetCookies.value = 1 }
// JavaScript inspired
{ $.Counts["RouteHandler:GetCookies"].value = 1 }
// Special character removed
{ $.Counts.RouteHandlerGetCookies.value = 1 }
Run Code Online (Sandbox Code Playgroud)

没有什么我能想出来的工作,也许这是不可能的.这些文档似乎没有解决这种情况.

任何人都知道如何搜索属性包含特殊字符的JSON日志,或者知道这是否支持?

在新的工作中,我们将使用不同的分隔符,但我们不会回去并在任何地方进行更改.

Dan*_*llo 8

在撰写本文时,这是不可能的。唯一的解决方法是使用非 JSON 语法并搜索确切的字符串。以下过滤器:

"\"RouteHandler:GetCookies\": {\"value\": 1}"
Run Code Online (Sandbox Code Playgroud)

将匹配此日志事件:

{"Counts": {"RouteHandler:GetCookies": {"value": 1}}}
Run Code Online (Sandbox Code Playgroud)

显然,缺点是空白和位置很重要。


小智 7

使用 CloudWatch Logs 仍然无法做到这一点,但您可以使用 CloudWatch Logs Insights 来做到这一点,无论如何,它更适合使用结构化日志记录。Logs Insights 将自动发现 JSON 日志记录中的字段,并提供带有内置命令和函数的强大查询语言。

在查询中,您只需用反引号引用属性名称,例如:

fields @timestamp, @message
| filter `Counts.RouteHandler:GetCookies.value` = 1
Run Code Online (Sandbox Code Playgroud)

文档中:

@您必须将查询中命名的日志字段括起来,这些字段包含除符号、句点 ( )之外的字符.以及反引号键 ( ) 中的非字母数字字符`。例如,日志字段foo-bar必须用反引号 ( ) 括起来,`foo-bar`因为它包含非字母数字字符,即连字符 ( -)。