我有一个在 Fargate 中运行的 docker 容器,它使用 log4j-layout-template 或 Springboot ecs 格式 json 日志将 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,不会被解析,但 应该是可发现的。
如何解析这些字段?
我在Cloud Watch中寻找的是这样的:
@时间戳 | ecs.版本 | 日志级别 | 留言 | log.logger |
---|---|---|---|---|
2022-03-22T09:08:16.838Z | 1.2.0 | 信息 | 服务器版本名称:... | org.apache... |
2022-03-22T09:08:16.838Z | 1.2.0 | 信息 | “服务器已建成:... | org.apache... |
解析没有任何问题,您的事件正在被正确解析。
以下查询应该可以正常工作:
fields @timestamp, @message
| filter log.level="INFO"
| sort @timestamp desc
Log Stream UI 不显示推断的嵌套结构,但仍可用于查询。