如何使用 CDK 在 Fargate 中使用 json 日志?

How do I consume json logs inside Fargate using CDK?

我在 Fargate 中有一个 docker 容器 运行,它使用 log4j-layout-template 将 json 日志发送到控制台。

发出的日志如下所示:

{"@timestamp":"2022-03-22T09:08:16.838Z","ecs.version":"1.2.0","log.level":"INFO","message":"Server version name:   Apache Tomcat/8.5.76","process.thread.name":"main","log.logger":"org.apache.catalina.startup.VersionLoggerListener"}
{"@timestamp":"2022-03-22T09:08:16.838Z","ecs.version":"1.2.0","log.level":"INFO","message":"Server built:          Feb 23 2022 17:59:11 UTC","process.thread.name":"main","log.logger":"org.apache.catalina.startup.VersionLoggerListener"}

我使用以下配置我的 CDK:

var def = ingestGatewayTaskDefinition.addContainer(
  id + "Container",
  ContainerDefinitionOptions
    .builder()
    .image(fromEcrRepository(ecrRepository))
    .memoryLimitMiB(memory)
    .cpu(cpu)
    .environment(environment)
    .secrets(secrets)
    .logging(
      LogDriver.awsLogs(
        AwsLogDriverProps
          .builder()
          .logGroup(
            LogGroup.Builder
              .create(this, props.getServiceName())
              .logGroupName("dev/" + props.getServiceName())
              .retention(RetentionDays.ONE_DAY)
              .build()
          )
          .streamPrefix("dev/" + props.getServiceName())
          //.datetimeFormat("%Y-%m-%dT%H:%M:%SZ") //??
          .build()
      )
    )
    .build()
);

但在 Cloud Watch 中,消息部分是 json 并且未被解析,而是 should be discoverable

如何解析这些字段?

这是最终的样子:

我在云看中找的是这个:

@timestamp ecs.version log.level message log.logger
2022-03-22T09:08:16.838Z 1.2.0 INFO Server version name:... org.apache...
2022-03-22T09:08:16.838Z 1.2.0 INFO "Server built:... org.apache...

解析没有问题,您的事件解析正确。

以下查询应该可以正常工作:

fields @timestamp, @message
| filter log.level="INFO"
| sort @timestamp desc

Log StreamUI不显示推断的嵌套结构,但仍可供查询。