简介编辑

使用 Elastic Stack 简化集中式应用程序日志记录。

62682932 9cac3600 b9bd 11e9 9cc3 39e907280f8e

什么是 ECS?编辑

Elastic Common Schema (ECS) 定义了一套用于将数据导入 Elasticsearch 的通用字段。有关 ECS 的更多信息,请访问 ECS 参考文档

什么是 ECS 日志记录?编辑

ECS 日志记录器是您最喜欢的日志记录库的插件。它们可以轻松地将您的日志格式化为与 ECS 兼容的 JSON。例如

{"@timestamp":"2019-08-06T12:09:12.375Z", "log.level": "INFO", "message":"Tomcat started on port(s): 8080 (http) with context path ''", "service.name":"spring-petclinic","process.thread.name":"restartedMain","log.logger":"org.springframework.boot.web.embedded.tomcat.TomcatWebServer"}
{"@timestamp":"2019-08-06T12:09:12.379Z", "log.level": "INFO", "message":"Started PetClinicApplication in 7.095 seconds (JVM running for 9.082)", "service.name":"spring-petclinic","process.thread.name":"restartedMain","log.logger":"org.springframework.samples.petclinic.PetClinicApplication"}
{"@timestamp":"2019-08-06T14:08:40.199Z", "log.level":"DEBUG", "message":"init find form", "service.name":"spring-petclinic","process.thread.name":"http-nio-8080-exec-8","log.logger":"org.springframework.samples.petclinic.owner.OwnerController","transaction.id":"28b7fb8d5aba51f1","trace.id":"2869b25b5469590610fea49ac04af7da"}

入门编辑

请参阅各个日志记录器的安装说明

为什么要使用 ECS 日志记录?编辑

简单性:无需手动解析

日志以预先格式化的形式到达,预先丰富并准备添加价值,从而使问题更快速、更轻松地识别。不再需要繁琐的 grok 解析,而 grok 解析必须为每个应用程序定制。

相当人性化的 JSON 结构

前三个字段是 @timestamplog.levelmessage。这使您能够轻松地在终端中读取日志,而无需使用将日志转换为纯文本的工具。

享受通用架构的好处

无需额外配置即可使用 Kibana 日志应用程序

在不同的服务和团队中使用通用架构可以创建可重复使用的仪表板并避免 映射爆炸

APM 日志关联

如果您使用的是 Elastic APM 代理,则无需任何额外配置即可利用 日志关联功能。这使您能够从 APM UI 中的跨度时间线跳转到 日志应用程序,仅显示属于相应请求的日志。反之亦然,您也可以从日志 UI 中的日志行跳转到 APM UI 的跨度时间线。

与 Filebeat 结合使用时的额外优势编辑

我们建议使用 Filebeat 传输日志。根据应用程序的部署方式,您可能将日志记录到日志文件或标准输出(例如,在 Kubernetes 中)。

与直接从应用程序将日志发送到 Elasticsearch 相比,这有以下几个好处

在发生故障时具有弹性

保证至少一次交付,无需在应用程序中进行缓冲,因此不会出现内存不足错误或事件丢失的风险。还可以选择使用 JSON 日志或纯文本日志作为备用。

松散耦合

应用程序无需了解日志记录后端(URI、凭据等)的详细信息。您还可以利用替代的 Filebeat 输出,例如 Logstash、Kafka 或 Redis。

索引生命周期管理

利用 Filebeat 的默认 索引生命周期管理设置。这比使用每日索引效率高得多。

有效的 Elasticsearch 映射

利用 Filebeat 的默认与 ECS 兼容的 索引模板

字段映射编辑

默认字段编辑

这些字段由 ECS 日志记录器默认填充。其中一些字段(例如 log.origin.* 字段)可能需要显式启用。其他字段(例如 process.thread.name)不适用于所有语言。有关更多信息,请参阅各个日志记录器的文档。

ECS 字段 描述 示例

@timestamp

日志事件的时间戳。

"2019-08-06T12:09:12.375Z"

log.level

日志事件的级别或严重性。

"INFO"

log.logger

应用程序内部的日志记录器名称。

"org.example.MyClass"

log.origin.file.name

包含生成日志事件的源代码的文件名称。

"App.java"

log.origin.file.line

包含生成日志事件的源代码的文件的行号。

42

log.origin.function

生成日志事件的函数或方法的名称。

"methodName"

message

日志消息。

"Hello World!"

error.type

仅适用于包含异常或错误的日志。如果此日志事件包含异常,则为错误的类型或类。

"java.lang.NullPointerException"

error.message

仅适用于包含异常或错误的日志。异常或错误的消息。

"The argument cannot be null"

error.stack_trace

仅适用于包含异常或错误的日志。异常或错误的完整堆栈跟踪(作为原始字符串)。

"Exception in thread "main" java.lang.NullPointerException\n\tat org.example.App.methodName(App.java:42)"

process.thread.name

记录事件的线程的名称。

"main"

可配置字段编辑

有关如何设置这些字段,请参阅各个日志记录器的文档。

ECS 字段 描述 示例

service.name

帮助按服务筛选日志。

"my-service"

service.version

帮助按服务版本筛选日志。

"1.0"

service.environment

帮助按环境筛选日志。

"production"

service.node.name

允许同一主机上同一个服务的两个节点区分开来。

"instance-0000000016"

event.dataset

启用 日志速率异常检测

"my-service"

自定义字段编辑

大多数日志记录器允许您添加额外的自定义字段。这包括静态字段和动态字段。动态字段的示例包括记录结构化对象,或来自线程本地上下文的字段,例如 MDCThreadContext

在添加自定义字段时,我们建议为这些自定义值使用现有的 ECS 字段。如果不存在合适的 ECS 字段,请考虑使用 labels.(如 labels.foo)作为简单键值对的字段前缀。对于嵌套结构,请考虑使用 custom. 作为前缀。这种方法可以防止在 ECS 之后添加相同字段但映射不同的情况下发生冲突。