配置 Spring Boot 使用 log4j2 和 ECS 非常简单。我们需要做的就是在 pom.xml 中包含以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>co.elastic.logging</groupId>
<artifactId>log4j2-ecs-layout</artifactId>
<version>1.0.1</version>
</dependency>
然后在 log4j2.xml 文件中我们只需要包含这样的内容:
<Console name="prod" target="SYSTEM_OUT">
<EcsLayout serviceName="${service-name}" stackTraceAsArray="true" includeOrigin="true" includeMarkers="true" />
</Console>
但是,当我们配置 Spring Boot 将应用程序访问日志记录在 application.yml 中时,我们会这样做:
server:
tomcat:
accesslog:
enabled: true
encoding: UTF-8
directory: /dev
prefix: stdout
buffered: false
suffix:
file-date-format:
pattern: "ACCESS_LOG: %h %l %u \"%{yyyy-MM-dd HH:mm:ss.SSS}t\" \"%r\" status=%s size=%b \"user-agent=%{User-Agent}i\""
访问日志不会通过 EcsLayout 以 json 形式记录。
如何配置 Spring Boot 应用程序以使用弹性通用架构 (json) 格式将 tomcat 访问日志以 json 形式记录到控制台?
log4j2 引入了 JsonTemplateLayout,它根据提供的 JSON 模板描述的结构对 LogEvents 进行编码。它们还支持 Elastic Common Schema (ECS) 布局(可通过 classpath:EcsLayout.json 访问)。您还可以使用此方法将自定义字段添加到输出中,如其文档中所示。
将依赖项添加到您的 pom.xml 文件中
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-layout-template-json</artifactId>
<version>2.20.0</version>
</dependency>
如图所示配置log4j2.xml文件
<Console name="prod" target="SYSTEM_OUT">
<JsonTemplateLayout eventTemplateUri="classpath:EcsLayout.json"/>
</Console>
现在您应该能够在控制台的 ECS 布局中看到 JSON 输出。