У меня есть док-контейнер, работающий в Fargate, который выводит журналы json на консоль, используя log4j-макет-шаблон.
Выдаваемые логи выглядят так:
{"@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 | ИНФОРМАЦИЯ | Название версии сервера:... | орг.апач... |
2022-03-22T09:08:16.838Z | 1.2.0 | ИНФОРМАЦИЯ | "Сервер построен:... | орг.апач... |
@gshpychka, он улавливает timestamp
, но message
выглядит как отформатированный json
Можете ли вы добавить скриншот? Я не уверен, что понимаю.
Спасибо, я обновил вопрос. Я предполагаю, что эти поля должны быть обнаружены, чтобы я мог делать запросы к ним.
Хорошо, похоже, что он проанализирован правильно, вы должны иметь возможность запрашивать их как есть. С какой проблемой вы столкнулись?
Ты прав. Если я запрошу "log.level" = "INFO"
, он отфильтрует правильно... Я предполагал, что пользовательский интерфейс покажет столбцы...
Хорошо, я добавил ответ.
В парсинге нет ничего плохого, ваши события анализируются правильно.
Следующий запрос должен работать корректно:
fields @timestamp, @message
| filter log.level = "INFO"
| sort @timestamp desc
Пользовательский интерфейс Log Stream не отображает предполагаемую вложенную структуру, но по-прежнему доступен для запросов.
Что происходит, когда вы расширяете сообщение с помощью кнопки со стрелкой?