![如何在 EKS 1.22(containerd)中使用 Fluent Bit 将 JSON 标记化的日志放入 CloudWatch](https://linux22.com/image/778562/%E5%A6%82%E4%BD%95%E5%9C%A8%20EKS%201.22%EF%BC%88containerd%EF%BC%89%E4%B8%AD%E4%BD%BF%E7%94%A8%20Fluent%20Bit%20%E5%B0%86%20JSON%20%E6%A0%87%E8%AE%B0%E5%8C%96%E7%9A%84%E6%97%A5%E5%BF%97%E6%94%BE%E5%85%A5%20CloudWatch.png)
我希望在 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 位文档: