过滤 AWS CloudWatch,有些事件是 JSON,有些是文本

Filtering AWS CloudWatch were some events are JSON and some are text

我正在使用订阅过滤器从 CloudWatch 日志组流式传输日志流,但我不知道如何正确过滤事件。以下示例将在 Elastic Kubernetes Service (EKS) 集群的日志组中创建订阅过滤器。此日志组包含 5x 个日志流。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ClusterName:
    Type: String
Resources:
  TriggerEksControlPlane1:
    Type: AWS::Logs::SubscriptionFilter
    Properties: 
      DestinationArn: !Sub "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:newrelic-log-ingestion"
      FilterPattern: "{ $.level != \"Metadata\" }"
      LogGroupName: !Sub /aws/eks/${ClusterName}/cluster

问题是其中一个流的格式为 JSON,而其他流是纯文本。在这种情况下,使用过滤器 { $.level != "Metadata" } 会导致 JSON 日志流的事件按预期流式传输,但根本不会流式传输来自其他日志组的事件。在 CloudWatch 中测试过滤器证实了这一点。

所以我的问题是......我如何编写一个过滤器来查找非JSON事件和JSON事件,其中{ $.level != "Metadata" }?

请注意,文档似乎表明 EKS 无法将日志流放入非默认的日志组 (/aws/eks/${ClusterName}/cluster)。

所以在沉睡之后,事实证明你可以在 JSON 格式的日志上使用简单的匹配。虽然文档没有说你可以,但我认为 AWS 明确说明它确实有效是一个很好的补充。

所以在我的例子中,以下工作过滤掉 JSON 日志,其中 level = "Metadata",并包括我不希望包含此类文本的文本日志。

-"\"level\":\"Metadata\""