1.4. ClusterLogForwarder 的结构
CLF 有一个 spec
部分,其中包含以下关键组件:
- 输入
-
选择要转发的日志消息。来自集群不同部分的内置输入类型
application
,infrastructure
和audit
。您还可以定义自定义输入。 - 输出
- 定义要将日志转发到的目的地。每个输出都有一个唯一的名称和特定于类型的配置。
- Pipelines
- 定义通过过滤器到输出的路径日志从输入中获取。管道具有唯一名称,它由输入、输出和过滤器名称列表组成。
- 过滤器
- 在管道中转换或丢弃日志消息。用户可以定义匹配某些日志字段并丢弃或修改消息的过滤器。过滤器按管道中指定的顺序应用。
1.4.1. 输入 复制链接链接已复制到粘贴板!
输入在 spec.inputs
下的阵列中配置。有三个内置输入类型:
- application
- 从所有应用程序容器中选择日志,不包括基础架构命名空间中的日志。
- infrastructure
从节点以及在以下命名空间中运行的基础架构组件中选择日志:
-
default
-
kube
-
openshift
-
包含
kube-
或openshift-
前缀
-
- audit
- 从 OpenShift API 服务器审计日志、Kubernetes API 服务器审计日志、ovn 审计日志和 auditd 的节点审计日志中选择日志。
用户可以定义类型 application
的自定义输入,它们从特定的命名空间选择日志或使用 pod 标签。
1.4.2. 输出 复制链接链接已复制到粘贴板!
输出在 spec.outputs
下的一个数组中配置。每个输出都必须具有唯一的名称和类型。支持的类型有:
- azureMonitor
- 将日志转发到 Azure Monitor。
- cloudwatch
- 将日志转发到 AWS CloudWatch。
- googleCloudLogging
- 将日志转发到 Google Cloud Logging。
- http
- 将日志转发到通用 HTTP 端点。
- kafka
- 将日志转发到 Kafka 代理。
- loki
- 将日志转发到 Loki 日志记录后端。
- lokistack
- 将日志转发到 Loki 和 Web 代理与 OpenShift Container Platform 身份验证集成支持的日志组合。LokiStack 的代理使用 OpenShift Container Platform 身份验证来强制实施多租户
- otlp
- 使用 OpenTelemetry 协议转发日志。
- splunk
- 将日志转发到 Splunk。
- syslog
- 将日志转发到外部 syslog 服务器。
每种输出类型都有自己的配置字段。
1.4.3. Pipelines 复制链接链接已复制到粘贴板!
管道在 spec.pipelines
下的数组中配置。每个管道都必须具有唯一的名称,它由以下组成:
- inputRefs
- 日志应转发到此管道的输入名称。
- outputRefs
- 将日志发送到的输出名称。
- filterRefs
- (可选)要应用的过滤器名称。
filterRefs 的顺序很重要,因为它们会按顺序应用。较早的过滤器可以丢弃不会被后续过滤器处理的消息。
1.4.4. 过滤器 复制链接链接已复制到粘贴板!
过滤器在 spec.filters
下的数组中配置。它们可以根据结构化字段的值匹配传入的日志消息,并修改或丢弃它们。
管理员可以配置以下过滤器:
1.4.5. 启用多行异常检测 复制链接链接已复制到粘贴板!
启用容器日志的多行错误检测。
启用此功能可能会对性能有影响,可能需要额外的计算资源或备用日志记录解决方案。
日志解析器通常会错误地将同一个例外中的不同的行识别为不同的例外。这会导致额外的日志条目,以及要跟踪的信息的不完整或不正确。
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)
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)包含.spec.filters
下的detectMultilineErrors
字段。
ClusterLogForwarder CR 示例
1.4.5.1. 详情 复制链接链接已复制到粘贴板!
当日志消息作为一系列针对一个例外的信息出现时,会将它们合并到一个统一的日志记录中。第一个日志消息的内容被替换为序列中所有消息字段的连接内容。
收集器支持以下语言:
- Java
- JS
- Ruby
- Python
- Golang
- PHP
- Dart
1.4.6. 配置内容过滤器以丢弃不需要的日志记录 复制链接链接已复制到粘贴板!
收集所有集群日志会生成大量数据,这可能会造成移动和存储的代价。要减少卷,您可以配置 drop
过滤器,以在转发前排除不需要的日志记录。日志收集器根据过滤器评估日志流,并丢弃与指定条件匹配的记录。
drop
过滤器使用 test
字段来定义一个或多个用于评估日志记录的条件。过滤器应用以下规则来检查是否丢弃记录:
- 如果所有指定条件都评估为 true,则测试通过。
- 如果测试通过,则过滤器会丢弃日志记录。
-
如果您在
drop
过滤器配置中定义多个测试,如果任何测试通过,则过滤器会丢弃日志记录。 - 如果评估条件时出错,例如,没有引用的字段,则该条件评估为 false。
先决条件
- 已安装 Red Hat OpenShift Logging Operator。
- 有管理员权限。
-
您已创建了
ClusterLogForwarder
自定义资源 (CR)。 -
已安装 OpenShift CLI(
oc
)。
流程
提取现有的
ClusterLogForwarder
配置并将其保存为本地文件。oc get clusterlogforwarder <name> -n <namespace> -o yaml > <filename>.yaml
$ oc get clusterlogforwarder <name> -n <namespace> -o yaml > <filename>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
-
<
;name> 是您要配置的ClusterLogForwarder
实例的名称。 -
<
;namespace> 是创建ClusterLogForwarder
实例的命名空间,如openshift-logging
。 -
<filename
> 是保存配置的本地文件的名称。
-
添加配置,将不需要的日志记录放到
ClusterLogForwarder
CR 中的filters
spec 中。ClusterLogForwarder
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定过滤器的类型。
drop
过滤器丢弃与过滤器配置匹配的日志记录。 - 2
- 指定
drop
过滤器的配置选项。 - 3
- 指定测试条件来评估过滤器是否丢弃日志记录。
- 4
- 指定日志记录中字段的点分隔路径。
-
每个路径片段可以包含字母数字字符和下划线、
a-z
、A-Z
、0-9
、_
,如.kubernetes.namespace_name
。 -
如果片段包含不同的字符,则片段必须在引号里,例如 .
kubernetes.labels."app.version-1.2/beta
"。 -
您可以在单个测试配置中包括多个字段路径,但它们都必须评估为 true 才能使测试通过,以及要应用的
drop
过滤器。
-
每个路径片段可以包含字母数字字符和下划线、
- 5
- 指定一个正则表达式。如果日志记录与此正则表达式匹配,它们将被丢弃。
- 6
- 指定一个正则表达式。如果日志记录与此正则表达式不匹配,它们将被丢弃。
- 7
- 指定使用
drop
过滤器的管道。
注意您可以为单个
field
路径设置matches
或notMatches
条件,但不能同时设置这两个条件。仅保留高优先级日志记录的示例配置
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 具有多个测试的配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用
ClusterLogForwarder
CR:oc apply -f <filename>.yaml
$ oc apply -f <filename>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.7. API 审计过滤器概述 复制链接链接已复制到粘贴板!
OpenShift API 服务器为每个 API 调用生成审计事件。这些事件包括请求、响应和请求者身份的详细信息。这可能导致大量数据。
API 审计过滤器帮助通过使用规则排除非主题事件并缩小事件大小,从而管理审计跟踪。规则按顺序检查,检查会在第一个匹配项时停止。事件中的数据量取决于 level
字段的值:
-
None
: 事件被丢弃。 -
Metadata
:事件包括审计元数据,并排除请求和响应正文。 -
Request
: 事件包括审计元数据和请求正文,并排除响应正文。 -
Request
response :事件包括所有数据:metadata、request 正文和响应正文。响应正文可能非常大。例如,oc get pods -A
生成包含集群中每个 pod 的 YAML 描述的响应正文。
只有在日志记录部署中设置了 Vector 收集器时,您只能使用 API 审计过滤器功能。
ClusterLogForwarder
自定义资源(CR)使用与标准 Kubernetes 审计策略 相同的格式。ClusterLogForwarder
CR 提供以下额外功能:
- 通配符
-
用户、组、命名空间和资源的名称可以在前导或尾部带有
*
星号字符。例如,openshift-\*
命名空间与openshift-apiserver
或openshift-authentication
命名空间匹配。\*/status
资源与Pod/status
或Deployment/status
资源匹配。 - 默认规则
与策略中任何规则不匹配的事件将被过滤,如下所示:
-
get
、list
和watch
等只读系统事件会被丢弃。 - 服务帐户写入发生在与服务帐户相同的命名空间中的事件将被丢弃。
- 所有其他事件都会被转发,受任何配置的速率限制。
要禁用这些默认值,请使用只有一个
level
字段的规则结束您的规则列表,或者添加一条空规则。-
- 省略响应代码
-
要省略的整数状态代码列表。您可以使用
OmitResponseCodes
字段(没有创建事件)的 HTTP 状态代码列表根据响应中的 HTTP 状态代码丢弃事件。默认值为[404, 409, 422, 429]
。如果值为空列表[]
,则不会省略任何状态代码。
ClusterLogForwarder
CR Audit 策作为 OpenShift Container Platform 审计策略外的补充起作用。ClusterLogForwarder
CR 审计过滤器更改日志收集器转发的内容,并提供按操作动词、用户、组、命名空间或资源过滤的功能。您可以创建多个过滤器,将同一审计流的不同摘要发送到不同的位置。例如,您可以将详细的流发送到本地集群日志存储,并将不太详细的流发送到远程站点。
-
您必须具有
collect-audit-logs
集群角色才能收集审计日志。 - 以下示例旨在说明审计策略中可能的规则范围,不是推荐的配置。
Audit 策略示例
1.4.8. 在输入 ny 过滤应用程序日志,包括标签表达式或匹配的标签键和值 复制链接链接已复制到粘贴板!
您可以使用 input
选择器,根据标签表达式或匹配的标签键及其值包含应用程序日志。
流程
将过滤器的配置添加到
ClusterLogForwarder
CR 中的input
spec 中。以下示例演示了如何配置
ClusterLogForwarder
CR,使其包含基于标签表达式或匹配的标签键/值的日志:ClusterLogForwarder
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来应用
ClusterLogForwarder
CR:oc apply -f <filename>.yaml
$ oc apply -f <filename>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.9. 配置内容过滤器以修剪日志记录 复制链接链接已复制到粘贴板!
如果配置 prune
过滤器,日志收集器在转发前会根据过滤器评估日志收集器。收集器通过删除 pod 注解等低值字段来修剪日志记录。
先决条件
- 已安装 Red Hat OpenShift Logging Operator。
- 有管理员权限。
-
您已创建了
ClusterLogForwarder
自定义资源 (CR)。 -
已安装 OpenShift CLI(
oc
)。
流程
提取现有的
ClusterLogForwarder
配置并将其保存为本地文件。oc get clusterlogforwarder <name> -n <namespace> -o yaml > <filename>.yaml
$ oc get clusterlogforwarder <name> -n <namespace> -o yaml > <filename>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
-
<
;name> 是您要配置的ClusterLogForwarder
实例的名称。 -
<
;namespace> 是创建ClusterLogForwarder
实例的命名空间,如openshift-logging
。 -
<filename
> 是保存配置的本地文件的名称。
-
将配置添加到
ClusterLogForwarder
CR 的filters
spec 中。重要如果您同时指定了
in
和notIn
参数,则notIn
数组在修剪过程中优先于。在使用
notIn
数组修剪记录后,会使用in
数组修剪它们。ClusterLogForwarder
CR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定过滤器的类型。
prune
过滤器根据配置的字段修剪日志记录。 - 2
- 指定
prune
过滤器的配置选项。-
in
和notIn
字段是日志记录中字段的以点分隔的路径的数组。 -
每个路径片段可以包含字母数字字符和下划线、
a-z
、A-Z
、0-9
、_
,如.kubernetes.namespace_name
。 -
如果片段包含不同的字符,则片段必须在引号里,例如 .
kubernetes.labels."app.version-1.2/beta
"。
-
- 3
- 可选:指定要从日志记录中删除的字段。日志收集器保留所有其他字段。
- 4
- 可选:指定要保留在日志记录中的字段。日志收集器移除所有其他字段。
- 5
- 指定
prune
过滤器应用到的管道。重要-
过滤器不能从日志记录中删除
.log_type
、.log_source
、.message
字段。您必须在notIn
字段中包含它们。 -
如果使用
googleCloudLogging
输出,则必须在notIn
字段中包含.hostname
。
-
过滤器不能从日志记录中删除
运行以下命令来应用
ClusterLogForwarder
CR:oc apply -f <filename>.yaml
$ oc apply -f <filename>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow