入门
编辑入门编辑
步骤 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
其他应用程序
您要做的就是使用 co.elastic.logging.logback.EcsEncoder
来代替 logback.xml
中的默认模式编码器
<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>
不要使用通常的 <PatternLayout/>
,而要使用 <EcsLayout serviceName="my-app"/>
。例如
<?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 或映射表示。
不要使用通常的布局类 "org.apache.log4j.PatternLayout"
,而要使用 "co.elastic.logging.log4j.EcsLayout"
。例如
<?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
来启用。
步骤 2:配置 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 会递归地对解码后的 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
启用时 edit
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")); }