如何在 EKS 1.22(containerd)中使用 Fluent Bit 将 JSON 标记化的日志放入 CloudWatch

如何在 EKS 1.22(containerd)中使用 Fluent Bit 将 JSON 标记化的日志放入 CloudWatch

我希望在 AWS EKS(版本 1.22)中运行时,从 CRI 应用程序日志中获取带有正确 json 标记的 AWS 日志条目消息

我的应用程序输出有效的 json,但日志行前面添加了YYYY-MM-DDTHH:MM:SS.MILLIZ stdout F。这意味着标准 JSON 解析器不起作用。

使用正则表达式解析器http://rubular.com/r/tjUt3Awgg4,我上面示例中的时间、流和日志标签均已正确识别,但我无法标记消息 JSON。我的日志内容位于密钥中message

[PARSER]
        # http://rubular.com/r/tjUt3Awgg4
        Name cri
        Format regex
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z

有没有办法堆叠解析器,或者在将日志行发送到解析器之前删除日志行的第一部分?我尝试在过滤器中使用 remove_regex,但无法成功。

答案1

我们正在使用带有 Fargate 的 EKS,此配置为我们解决了这个问题。

kind: ConfigMap
apiVersion: v1
metadata:
  name: aws-logging
  namespace: aws-observability
data:
  output.conf: |
    [OUTPUT]
        Name cloudwatch_logs
        Match   *
        region region-code
        log_group_name fluent-bit-cloudwatch
        log_stream_prefix from-fluent-bit-
        auto_create_group true
        log_key log

  parsers.conf: |
    [PARSER]
        Name crio
        Format Regex
        Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$
        Time_Key    time
        Time_Format %Y-%m-%dT%H:%M:%S.%L%z
  
  filters.conf: |
     [FILTER]
        Name parser
        Match *
        Key_name log
        Parser crio

如在https://docs.aws.amazon.com/eks/latest/userguide/fargate-logging.html

答案2

我们使用 CRI-O 的内置多行解析器和 Kubernetes 过滤器中的 Merge_Log 参数,在我们的例子中效果很好:

[INPUT]
    Name                tail
    Path                /var/log/containers/*.log
    multiline.parser    cri
...

[FILTER]
    Name                kubernetes
    Merge_Log           On
    Merge_Log_Key       log_processed
...

Fluent 位文档:

相关内容