入门
编辑入门
编辑步骤 1:配置应用程序日志记录
编辑如果您正在使用 Elastic APM Java 代理,将您的日志转换为 ECS 兼容的 JSON 格式的最简单方法是通过 log_ecs_reformatting
配置选项。只需设置此选项,Java 代理将自动导入正确的 ECS 日志库并配置您的日志框架以使用它(OVERRIDE
/REPLACE
)或在您当前配置的基础上添加(SHADE
)。无需其他更改!请务必查看其他 日志记录配置选项,以充分发挥此选项的潜力。
否则,请按照以下步骤通过日志框架配置手动应用 ECS 格式。支持以下日志框架
- Logback(Spring Boot 的默认值)
- Log4j2
- Log4j
-
java.util.logging
(JUL) - JBoss 日志管理器
添加依赖项
编辑最低要求的 logback 版本为 1.1。
向您的应用程序添加依赖项
<dependency> <groupId>co.elastic.logging</groupId> <artifactId>logback-ecs-encoder</artifactId> <version>${ecs-logging-java.version}</version> </dependency>
如果您没有使用像 maven 这样的依赖项管理工具,您必须手动将 logback-ecs-encoder
和 ecs-logging-core
jar 文件添加到类路径中。例如,添加到 $CATALINA_HOME/lib
目录。除此之外,没有其他必需的依赖项。
最低要求的 log4j2 版本为 2.6。
向您的应用程序添加依赖项
<dependency> <groupId>co.elastic.logging</groupId> <artifactId>log4j2-ecs-layout</artifactId> <version>${ecs-logging-java.version}</version> </dependency>
如果您没有使用像 maven 这样的依赖项管理工具,您必须手动将 log4j2-ecs-layout
和 ecs-logging-core
jar 文件添加到类路径中。例如,添加到 $CATALINA_HOME/lib
目录。除此之外,没有其他必需的依赖项。
最低要求的 log4j 版本为 1.2.4。
向您的应用程序添加依赖项
<dependency> <groupId>co.elastic.logging</groupId> <artifactId>log4j-ecs-layout</artifactId> <version>${ecs-logging-java.version}</version> </dependency>
如果您没有使用像 maven 这样的依赖项管理工具,您必须手动将 log4j-ecs-layout
和 ecs-logging-core
jar 文件添加到类路径中。例如,添加到 $CATALINA_HOME/lib
目录。除此之外,没有其他必需的依赖项。
用于 JUL (java.util.logging
) 的格式化程序,它生成与 ECS 兼容的记录。对于使用 JUL 作为主要日志框架的应用程序(如 Apache Tomcat)很有用。
向您的应用程序添加依赖项
<dependency> <groupId>co.elastic.logging</groupId> <artifactId>jul-ecs-formatter</artifactId> <version>${ecs-logging-java.version}</version> </dependency>
如果您没有使用像 maven 这样的依赖项管理工具,您必须手动将 jul-ecs-formatter
和 ecs-logging-core
jar 文件添加到类路径中。例如,添加到 $CATALINA_HOME/lib
目录。除此之外,没有其他必需的依赖项。
用于 JBoss 日志管理器的格式化程序,它生成与 ECS 兼容的记录。对于使用 JBoss 日志管理器作为其主要日志框架的应用程序(如 WildFly)很有用。
向您的应用程序添加依赖项
<dependency> <groupId>co.elastic.logging</groupId> <artifactId>jboss-logmanager-ecs-formatter</artifactId> <version>${ecs-logging-java.version}</version> </dependency>
如果您没有使用像 maven 这样的依赖项管理工具,您必须手动添加 jboss-logmanager-ecs-formatter
和 ecs-logging-core
jar 文件到类路径中。除此之外,没有其他必需的依赖项。
使用 ECS 编码器/格式化程序/布局
编辑Spring Boot 应用程序
在 src/main/resources/logback-spring.xml
中
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> <include resource="org/springframework/boot/logging/logback/file-appender.xml" /> <include resource="co/elastic/logging/logback/boot/ecs-console-appender.xml" /> <include resource="co/elastic/logging/logback/boot/ecs-file-appender.xml" /> <root level="INFO"> <appender-ref ref="ECS_JSON_CONSOLE"/> <appender-ref ref="CONSOLE"/> <appender-ref ref="ECS_JSON_FILE"/> <appender-ref ref="FILE"/> </root> </configuration>
您还需要在 application.properties
中配置以下属性
spring.application.name=my-application # for Spring Boot 2.2.x+ logging.file.name=/path/to/my-application.log # for older Spring Boot versions logging.file=/path/to/my-application.log
其他应用程序
您所要做的就是在 logback.xml
中使用 co.elastic.logging.logback.EcsEncoder
而不是默认的模式编码器
<encoder class="co.elastic.logging.logback.EcsEncoder"> <serviceName>my-application</serviceName> <serviceVersion>my-application-version</serviceVersion> <serviceEnvironment>my-application-environment</serviceEnvironment> <serviceNodeName>my-application-cluster-node</serviceNodeName> </encoder>
编码器参数
参数名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
|
设置 |
|
布尔值 |
|
|
|
布尔值 |
|
将 |
|
布尔值 |
|
如果 |
要在输出中包含任何自定义字段,请使用以下语法
<additionalField> <key>key1</key> <value>value1</value> </additionalField> <additionalField> <key>key2</key> <value>value2</value> </additionalField>
使用 <EcsLayout serviceName="my-app"/>
而不是通常的 <PatternLayout/>
。例如
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="DEBUG"> <Appenders> <Console name="LogToConsole" target="SYSTEM_OUT"> <EcsLayout serviceName="my-app" serviceVersion="my-app-version" serviceEnvironment="my-app-environment" serviceNodeName="my-app-cluster-node"/> </Console> <File name="LogToFile" fileName="logs/app.log"> <EcsLayout serviceName="my-app" serviceVersion="my-app-version" serviceEnvironment="my-app-environment" serviceNodeName="my-app-cluster-node"/> </File> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="LogToFile"/> <AppenderRef ref="LogToConsole"/> </Root> </Loggers> </Configuration>
布局参数
参数名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
|
设置 |
|
布尔值 |
|
|
|
布尔值 |
|
将 |
|
布尔值 |
|
如果 |
要在输出中包含任何自定义字段,请使用以下语法
<EcsLayout> <KeyValuePair key="key1" value="constant value"/> <KeyValuePair key="key2" value="$${ctx:key}"/> </EcsLayout>
自定义字段按照声明的顺序包含在内。这些值支持 查找。这意味着也可以利用 KeyValuePair
设置来动态设置预定义的字段
<EcsLayout serviceName="myService"> <KeyValuePair key="service.version" value="$${spring:project.version}"/> <KeyValuePair key="service.node.name" value="${env:HOSTNAME}"/> </EcsLayout>
log4j2 EcsLayout
不会分配任何内存(除非日志事件包含 Exception
),从而减少 GC 压力。这是通过手动序列化 JSON 来实现的,因此不需要日志事件的中间 JSON 或映射表示。
使用 "co.elastic.logging.log4j.EcsLayout"
而不是通常的布局类 "org.apache.log4j.PatternLayout"
。例如
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="LogToConsole" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="co.elastic.logging.log4j.EcsLayout"> <param name="serviceName" value="my-app"/> <param name="serviceNodeName" value="my-app-cluster-node"/> </layout> </appender> <appender name="LogToFile" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/app.log"/> <layout class="co.elastic.logging.log4j.EcsLayout"> <param name="serviceName" value="my-app"/> <param name="serviceNodeName" value="my-app-cluster-node"/> </layout> </appender> <root> <priority value="INFO"/> <appender-ref ref="LogToFile"/> <appender-ref ref="LogToConsole"/> </root> </log4j:configuration>
布局参数
参数名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
|
设置 |
|
布尔值 |
|
将 |
|
布尔值 |
|
如果 |
要在输出中包含任何自定义字段,请使用以下语法
<layout class="co.elastic.logging.log4j.EcsLayout"> <param name="additionalField" value="key1=value1"/> <param name="additionalField" value="key2=value2"/> </layout>
自定义字段按照声明的顺序包含在内。
为所需的日志处理程序指定 co.elastic.logging.jul.EcsFormatter
作为 formatter
。
例如,在 $CATALINA_HOME/conf/logging.properties
中
java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = co.elastic.logging.jul.EcsFormatter co.elastic.logging.jul.EcsFormatter.serviceName=my-app co.elastic.logging.jul.EcsFormatter.serviceVersion=my-app-version co.elastic.logging.jul.EcsFormatter.serviceEnvironment=my-app-environment co.elastic.logging.jul.EcsFormatter.serviceNodeName=my-app-cluster-node
布局参数
参数名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
|
设置 |
|
布尔值 |
|
将 |
|
布尔值 |
|
如果 |
|
字符串 |
向所有日志事件添加额外的静态字段。这些字段以逗号分隔的键值对形式指定。例如: |
为所需的日志处理器指定 co.elastic.logging.jboss.logmanager.EcsFormatter
作为 formatter
。
例如,使用 Wildfly 时,创建一个 jboss-logmanager-ecs-formatter
模块
$WILDFLY_HOME/bin/jboss-cli.sh -c 'module add --name=co.elastic.logging.jboss-logmanager-ecs-formatter --resources=jboss-logmanager-ecs-formatter-${ecs-logging-java.version}.jar:/tmp/ecs-logging-core-${ecs-logging-java.version}.jar --dependencies=org.jboss.logmanager'
将格式化程序添加到日志子系统中的处理器
$WILDFLY_HOME/bin/jboss-cli.sh -c '/subsystem=logging/custom-formatter=ECS:add(module=co.elastic.logging.jboss-logmanager-ecs-formatter, class=co.elastic.logging.jboss.logmanager.EcsFormatter, properties={serviceName=my-app,serviceVersion=my-app-version,serviceEnvironment=my-app-environment,serviceNodeName=my-app-cluster-node}),\ /subsystem=logging/console-handler=CONSOLE:write-attribute(name=named-formatter,value=ECS)'
布局参数
参数名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
设置 |
|
|
字符串 |
|
设置 |
|
布尔值 |
|
将 |
|
布尔值 |
|
如果为 |
|
字符串 |
向所有日志事件添加额外的静态字段。这些字段以逗号分隔的键值对形式指定。例如: |
如果您正在使用 Elastic APM Java 代理,从 1.30.0 版本开始默认启用日志关联。在之前的版本中,默认禁用日志关联,但可以通过将 enable_log_correlation
配置设置为 true
来启用它。
第二步:配置 Filebeat
编辑- 请按照 Filebeat 快速入门 进行操作
- 将以下配置添加到您的
filebeat.yaml
文件中。
对于 Filebeat 7.16+
filebeat.yaml。
filebeat.inputs: - type: filestream paths: /path/to/logs.json parsers: - ndjson: overwrite_keys: true add_error_key: true expand_keys: true processors: - add_host_metadata: ~ - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~
使用 filestream 输入来读取活动日志文件中的行。 |
|
如果发生冲突,解码后的 JSON 对象中的值将覆盖 Filebeat 通常添加的字段(类型、源、偏移量等)。 |
|
如果发生 JSON 反序列化错误,Filebeat 将添加一个 "error.message" 和 "error.type: json" 键。 |
|
Filebeat 将递归地取消点号(de-dot)解码后的 JSON 中的键,并将它们扩展为分层对象结构。 |
|
处理器可以增强您的数据。有关更多信息,请参阅 处理器。 |
对于 Filebeat < 7.16
filebeat.yaml。
filebeat.inputs: - type: log paths: /path/to/logs.json json.keys_under_root: true json.overwrite_keys: true json.add_error_key: true json.expand_keys: true processors: - add_host_metadata: ~ - add_cloud_metadata: ~ - add_docker_metadata: ~ - add_kubernetes_metadata: ~
- 确保您的应用程序将日志记录到 stdout/stderr。
- 请按照 在 Kubernetes 上运行 Filebeat 指南进行操作。
- 启用 基于提示的自动发现(取消注释
filebeat-kubernetes.yaml
中的相应部分)。 - 将这些注释添加到使用 ECS 日志记录器的 Pod 中。这将确保正确解析日志。
- 确保您的应用程序将日志记录到 stdout/stderr。
- 请按照 在 Docker 上运行 Filebeat 指南进行操作。
- 启用 基于提示的自动发现。
- 将这些标签添加到使用 ECS 日志记录器的容器中。这将确保正确解析日志。
docker-compose.yml。
有关更多信息,请参阅 Filebeat 参考。
启用 stackTraceAsArray
时
编辑通常,Filebeat 只能在每行只有一个 JSON 对象时解码 JSON。启用 stackTraceAsArray
后,每个堆栈跟踪元素都会有一个新行,这提高了可读性。但是当将多行设置与 decode_json_fields
结合使用时,我们还可以处理多行 JSON
filebeat.inputs: - type: log paths: /path/to/logs.json multiline.pattern: '^{' multiline.negate: true multiline.match: after processors: - decode_json_fields: fields: message target: "" overwrite_keys: true # flattens the array to a single string - script: when: has_fields: ['error.stack_trace'] lang: javascript id: my_filter source: > function process(event) { event.Put("error.stack_trace", event.Get("error.stack_trace").join("\n")); }