4.2. 配置日志记录部署
您可以使用每个 Operator 实施的自定义资源 (CR) YAML 文件配置日志记录子系统部署。
Red Hat Openshift Logging Operator:
-
ClusterLogging
(CL)- 部署收集器和转发器,它们目前都由每个节点上运行的 daemonset 实施。 -
ClusterLogForwarder
(CLF)- 生成收集器配置,以为每个用户配置转发日志。
Loki Operator :
-
LokiStack
- 将 Loki 集群控制为日志存储,以及带有 OpenShift Container Platform 身份验证集成的 Web 代理,以强制实施多租户。
OpenShift Elasticsearch Operator :
这些 CR 由 ClusterLogging
Operator 生成和管理,在没有使用 Operator 进行覆盖的情况下无法手动更改它们。
-
Elasticsearch
- 配置和部署 Elasticsearch 实例作为默认日志存储。 -
Kibana
- 配置和部署 Kibana 实例以搜索、查询和查看日志。
logging 子系统只支持本文档中介绍的配置选项。
不要使用任何其他配置选项,因为它们不被支持。各个 OpenShift Container Platform 发行版本的配置范例可能会有所变化,只有掌握了所有可能的配置,才能稳妥应对这样的配置变化。如果您使用本文档中描述的配置以外的配置,您的更改会被覆盖,因为 Operator 旨在协调差异。
如果必须执行 OpenShift Container Platform 文档中未描述的配置,您需要将 Red Hat OpenShift Logging Operator 设置为 Unmanaged
。不支持 Red Hat OpenShift 的非受管日志记录子系统,且不会接收更新,直到您将其状态返回为 Managed
为止。
4.2.1. 使用 Loki 启用基于流的保留
使用日志记录版本 5.6 及更高版本,您可以根据日志流配置保留策略。这些规则可全局设置,每个租户或两个都设置。如果同时配置这两个,则租户规则会在全局规则之前应用。
要启用基于流的保留,请创建一个
LokiStack
自定义资源(CR):全局的基于流的保留示例
apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: limits: global: 1 retention: 2 days: 20 streams: - days: 4 priority: 1 selector: '{kubernetes_namespace_name=~"test.+"}' 3 - days: 1 priority: 1 selector: '{log_type="infrastructure"}' managementState: Managed replicationFactor: 1 size: 1x.small storage: schemas: - effectiveDate: "2020-10-11" version: v11 secret: name: logging-loki-s3 type: aws storageClassName: standard tenants: mode: openshift-logging
针对一个租户的基于流的保留示例
apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: limits: global: retention: days: 20 tenants: 1 application: retention: days: 1 streams: - days: 4 selector: '{kubernetes_namespace_name=~"test.+"}' 2 infrastructure: retention: days: 5 streams: - days: 1 selector: '{kubernetes_namespace_name=~"openshift-cluster.+"}' managementState: Managed replicationFactor: 1 size: 1x.small storage: schemas: - effectiveDate: "2020-10-11" version: v11 secret: name: logging-loki-s3 type: aws storageClassName: standard tenants: mode: openshift-logging
应用
LokiStack
CR:$ oc apply -f <filename>.yaml
这不适用于为存储的日志管理保留。使用对象存储配置存储在支持的最大 30 天的全局保留周期。
4.2.2. 启用多行异常检测
启用容器日志的多行错误检测。
启用此功能可能会对性能有影响,可能需要额外的计算资源或备用日志记录解决方案。
日志解析器通常会错误地将同一个例外中的不同的行识别为不同的例外。这会导致额外的日志条目,以及要跟踪的信息的不完整或不正确。
java 异常示例
java.lang.NullPointerException: Cannot invoke "String.toString()" because "<param1>" is null at testjava.Main.handle(Main.java:47) at testjava.Main.printMe(Main.java:19) at testjava.Main.main(Main.java:10)
-
要启用日志记录来检测多行异常,并将其重新编译到一个日志条目中,请确保
ClusterLogForwarder
自定义资源 (CR) 包含detectMultilineErrors
字段,值为true
。
ClusterLogForwarder CR 示例
apiVersion: logging.openshift.io/v1 kind: ClusterLogForwarder metadata: name: instance namespace: openshift-logging spec: pipelines: - name: my-app-logs inputRefs: - application outputRefs: - default detectMultilineErrors: true
4.2.2.1. 详情
当日志消息作为一系列针对一个例外的信息出现时,会将它们合并到一个统一的日志记录中。第一个日志消息的内容被替换为序列中所有消息字段的连接内容。
表 4.1. 每个收集器支持的语言:
语言 | Fluentd | Vector |
---|---|---|
Java | ✓ | ✓ |
JS | ✓ | ✓ |
Ruby | ✓ | ✓ |
Python | ✓ | ✓ |
Golang | ✓ | ✓ |
PHP | ✓ | |
Dart | ✓ | ✓ |
4.2.2.2. 故障排除
启用后,收集器配置将包括一个新的部分,类型是:detect_exceptions
vector 配置部分的示例
[transforms.detect_exceptions_app-logs] type = "detect_exceptions" inputs = ["application"] languages = ["All"] group_by = ["kubernetes.namespace_name","kubernetes.pod_name","kubernetes.container_name"] expire_after_ms = 2000 multiline_flush_interval_ms = 1000
fluentd config 部分的示例
<label @MULTILINE_APP_LOGS> <match kubernetes.**> @type detect_exceptions remove_tag_prefix 'kubernetes' message message force_line_breaks true multiline_flush_interval .2 </match> </label>