8.2. 为 Elasticsearch 配置 JSON 日志数据
如果您的 JSON 日志遵循多个模式,在单个索引中存储它们可能会导致类型冲突和卡性问题。要避免这种情况,您必须配置 ClusterLogForwarder
自定义资源 (CR),将每个 schema 分组到单个输出定义中。这样,每个架构被转发到单独的索引。
如果您将 JSON 日志转发到 OpenShift Logging 管理的默认 Elasticsearch 实例,它会根据您的配置生成新的索引。为避免与索引数量过多相关的性能问题,请考虑通过标准化到常见模式来保持可能的模式数量较低。
结构类型
您可以使用 ClusterLogForwarder
CR 中的以下结构类型来为 Elasticsearch 日志存储构建索引名称:
structTypeKey
(字符串,可选)是消息字段的名称。如果存在该字段的值,则用于构造索引名称。-
kubernetes.labels.<key>
是 Kubernetes pod 标签,其值用于构造索引名称。 -
openshift.labels.<key>
是ClusterLogForwarder
CR 中的pipeline.label.<key>
元素,其值用于构造索引名称。 -
kubernetes.container_name
使用容器名称来构造索引名称。
-
-
structTypeName
:(字符串,可选)如果未设置structTypeKey
,或者其键不存在,OpenShift Logging 将structTypeName
的值用作结构化类型。当同时使用structuredTypeKey
和structuredTypeName
时,如果 JSON 日志数据中缺少structuredTypeKey
中的键,则structTypeName
提供一个回退索引名称。
虽然您可以将 structuredTypeKey
的值设置为 "Log Record Fields" 主题中显示的任何字段,但最有用的字段将显示在前面的结构类型列表中。
structuredTypeKey: kubernetes.labels.<key> 示例
假设如下:
- 集群正在运行以两种不同格式生成 JSON 日志的应用 pod,即 "apache" 和 "google"。
-
用户使用
logFormat=apache
和logFormat=google
标记这些应用 pod。 -
您可以在
ClusterLogForwarder
CR YAML 文件中使用以下代码片段。
outputDefaults: elasticsearch: structuredTypeKey: kubernetes.labels.logFormat 1 structuredTypeName: nologformat pipelines: - inputRefs: <application> outputRefs: default parse: json 2
在这种情况下,以下结构化日志记录进入 app-apache-write
索引:
{ "structured":{"name":"fred","home":"bedrock"}, "kubernetes":{"labels":{"logFormat": "apache", ...}} }
以下结构化日志记录进入 app-google-write
索引中:
{ "structured":{"name":"wilma","home":"bedrock"}, "kubernetes":{"labels":{"logFormat": "google", ...}} }
structuredTypeKey: openshift.labels.<key> 示例
假设您在 ClusterLogForwarder
CR YAML 文件中使用了以下代码片段:
outputDefaults: elasticsearch: structuredTypeKey: openshift.labels.myLabel 1 structuredTypeName: nologformat pipelines: - name: application-logs inputRefs: - application - audit outputRefs: - elasticsearch-secure - default parse: json labels: myLabel: myValue 2
在这种情况下,以下结构化日志记录进入 app-myValue-write
索引中:
{ "structured":{"name":"fred","home":"bedrock"}, "openshift":{"labels":{"myLabel": "myValue", ...}} }
其他注意事项
- 结构化记录的 Elasticsearch 索引通过将"app-"添加到结构化类型并附加 "-write" 来形成。
- 非结构化记录不会发送到结构化索引。在应用、基础架构或审计索引中,它们按照常态进行索引。
-
如果没有非空的结构化类型,则转发一个没有
structured
项的 unstructured 记录。
不要过载有太多索引的 Elasticsearch。仅对不同的日志格式使用不同的结构化类型,而不用为每个应用程序或命名空间都使用不同的结构化类型。例如,大多数 Apache 应用使用相同的 JSON 日志格式和结构化类型,如 LogApache
。