1.4. ClusterLogForwarder 的结构


CLF 有一个 spec 部分,其中包含以下关键组件:

输入
选择要转发的日志消息。来自集群不同部分的内置输入类型 application, infrastructureaudit。您还可以定义自定义输入。
输出
定义要将日志转发到的目的地。每个输出都有一个唯一的名称和特定于类型的配置。
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。
elasticsearch
将日志转发到外部 Elasticsearch 实例。
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. 配置 OTLP 输出

集群管理员可以使用 OpenTelemetry 协议(OTLP)输出来收集日志并将其转发到 OTLP 接收器。OTLP 输出使用 OpenTelemetry Observability 框架定义的规格使用 JSON 编码通过 HTTP 发送数据。

重要

OpenTelemetry 协议(OTLP)输出日志转发器只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

流程

  • 创建或编辑 ClusterLogForwarder 自定义资源(CR),通过添加以下注解来启用使用 OTLP 的转发:

    ClusterLogForwarder CR 示例

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      annotations:
        observability.openshift.io/tech-preview-otlp-output: "enabled" 
    1
    
      name: clf-otlp
    spec:
      serviceAccount:
        name: <service_account_name>
      outputs:
      - name: otlp
        type: otlp
        otlp:
          tuning:
            compression: gzip
            deliveryMode: AtLeastOnce
            maxRetryDuration: 20
            maxWrite: 10M
            minRetryDuration: 5
          url: <otlp_url> 
    2
    
      pipelines:
      - inputRefs:
        - application
        - infrastructure
        - audit
        name: otlp-logs
        outputRefs:
        - otlp
    Copy to Clipboard Toggle word wrap

    1
    使用此注解启用 OpenTelemetry 协议(OTLP)输出,它是一个技术预览功能。
    2
    此 URL 必须是绝对路径,是发送日志的 OTLP 端点的占位符。
注意

OTLP 输出使用 OpenTelemetry 数据模型,它与其他输出类型的 ViaQ 数据模型不同。它遵循 OpenTelemetry Observability 框架定义的 OpenTelemetry Semantic Conventions

1.4.4. Pipelines

管道在 spec.pipelines 下的数组中配置。每个管道都必须具有唯一的名称,它由以下组成:

inputRefs
日志应转发到此管道的输入名称。
outputRefs
将日志发送到的输出名称。
filterRefs
(可选)要应用的过滤器名称。

filterRefs 的顺序很重要,因为它们会按顺序应用。较早的过滤器可以丢弃不会被后续过滤器处理的消息。

1.4.5. 过滤器

过滤器在 spec.filters 下的数组中配置。它们可以根据结构化字段的值匹配传入的日志消息,并修改或丢弃它们。

管理员可以配置以下过滤器:

1.4.6. 启用多行异常检测

启用容器日志的多行错误检测。

警告

启用此功能可能会对性能有影响,可能需要额外的计算资源或备用日志记录解决方案。

日志解析器通常会错误地将同一个例外中的不同的行识别为不同的例外。这会导致额外的日志条目,以及要跟踪的信息的不完整或不正确。

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)
Copy to Clipboard Toggle word wrap

  • 要启用日志记录来检测多行异常并将其重新编译到单个日志条目中,请确保 ClusterLogForwarder 自定义资源(CR)包含 .spec.filters 下的 detectMultilineErrors 字段。

ClusterLogForwarder CR 示例

apiVersion: "observability.openshift.io/v1"
kind: ClusterLogForwarder
metadata:
  name: <log_forwarder_name>
  namespace: <log_forwarder_namespace>
spec:
  serviceAccount:
    name: <service_account_name>
  filters:
  - name: <name>
    type: detectMultilineException
  pipelines:
    - inputRefs:
        - <input-name>
      name: <pipeline-name>
      filterRefs:
        - <filter-name>
      outputRefs:
        - <output-name>
Copy to Clipboard Toggle word wrap

1.4.6.1. 详情

当日志消息作为一系列针对一个例外的信息出现时,会将它们合并到一个统一的日志记录中。第一个日志消息的内容被替换为序列中所有消息字段的连接内容。

收集器支持以下语言:

  • Java
  • JS
  • Ruby
  • Python
  • Golang
  • PHP
  • Dart

1.4.7. 通过 HTTP 转发日志

要启用通过 HTTP 转发日志,在 ClusterLogForwarder 自定义资源(CR)中指定 http 作为输出类型。

流程

  • 使用以下模板创建或编辑 ClusterLogForwarder CR:

    ClusterLogForwarder CR 示例

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: <log_forwarder_name>
      namespace: <log_forwarder_namespace>
    spec:
      managementState: Managed
      outputs:
      - name: <output_name>
        type: http
        http:
          headers:  
    1
    
              h1: v1
              h2: v2
          authentication:
            username:
              key: username
              secretName: <http_auth_secret>
            password:
              key: password
              secretName: <http_auth_secret>
          timeout: 300
          proxyURL: <proxy_url> 
    2
    
          url: <url> 
    3
    
        tls:
          insecureSkipVerify: 
    4
    
          ca:
            key: <ca_certificate>
            secretName: <secret_name> 
    5
    
      pipelines:
        - inputRefs:
            - application
          name: pipe1
          outputRefs:
            - <output_name>  
    6
    
      serviceAccount:
        name: <service_account_name> 
    7
    Copy to Clipboard Toggle word wrap

    1
    使用日志记录发送的其他标头。
    2
    可选:应用于通过 http 或 https 转发日志的 HTTP/HTTPS 代理的 URL。此设置覆盖集群或节点的任何默认代理设置。
    3
    日志的目标地址。
    4
    值可以是 truefalse
    5
    目标凭证的 secret 名称。
    6
    这个值应当与输出名称相同。
    7
    服务帐户的名称。

1.4.8. 使用 syslog 协议转发日志

您可以使用 syslog RFC3164RFC5424 协议将日志副本发送到配置为接受该协议的外部日志聚合器,而非默认的 Elasticsearch 日志存储。您需要配置外部日志聚合器(如 syslog 服务器)来接收来自 OpenShift Container Platform 的日志。

要使用 syslog 协议配置日志转,,请创建一个 ClusterLogForwarder 自定义资源(CR),并将一个或多个输出输出到使用这些输出的 syslog 服务器和管道。syslog 输出可以使用 UDP、TCP 或 TLS 连接。

先决条件

  • 您必须有配置为使用指定协议或格式接收日志数据的日志服务器。

流程

  1. 创建或编辑定义 ClusterLogForwarder CR 对象的 YAML 文件:

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: collector
    spec:
      managementState: Managed
      outputs:
      - name: rsyslog-east 
    1
    
        syslog:
          appName: <app_name> 
    2
    
          enrichment: KubernetesMinimal
          facility: <facility_value> 
    3
    
          msgId: <message_ID> 
    4
    
          payloadKey: <record_field> 
    5
    
          procId: <process_ID> 
    6
    
          rfc: <RFC3164_or_RFC5424> 
    7
    
          severity: informational 
    8
    
          tuning:
            deliveryMode: <AtLeastOnce_or_AtMostOnce> 
    9
    
          url: <url> 
    10
    
        tls: 
    11
    
          ca:
            key: ca-bundle.crt
            secretName: syslog-secret
        type: syslog
      pipelines:
      - inputRefs: 
    12
    
        - application
        name: syslog-east 
    13
    
        outputRefs:
        - rsyslog-east
      serviceAccount: 
    14
    
        name: logcollector
    Copy to Clipboard Toggle word wrap
    1
    指定输出的名称。
    2
    可选:指定 syslog 消息标头的 APP-NAME 部分的值。该值必须符合 Syslog 协议。该值可以是由字段路径后跟 || 组成的静态和动态值的组合,然后是另一个字段路径或静态值。最终值的最大长度为 48 个字符。您需要使用一个大括号将动态值括起,值必须后跟一个用 || 分隔的静态回退值。静态值只能包含字母数字字符以及短划线、下划线、点和正斜杠。示例值:<value1>-{.<value2>||"none"}。
    3
    可选:指定 syslog-msg 标头的 Facility 部分的值。
    4
    可选:指定 syslog-msg 标头的 MSGID 部分的值。该值可以是由字段路径后跟 || 组成的静态和动态值的组合,然后是另一个字段路径或静态值。最终值的最大长度为 32 个字符。您需要使用一个大括号将动态值括起,值必须后跟一个用 || 分隔的静态回退值。静态值只能包含字母数字字符以及短划线、下划线、点和正斜杠。示例值:<value1>-{.<value2>||"none"}。
    5
    可选:指定用作有效负载的记录字段。payloadKey 值必须是单一字段路径,包括在一个大括号 {} 中。示例:{.<value>}。
    6
    可选:指定 syslog 消息标头的 PROCID 部分的值。该值必须符合 Syslog 协议。该值可以是由字段路径后跟 || 组成的静态和动态值的组合,然后是另一个字段路径或静态值。最终值的最大长度为 48 个字符。您需要使用一个大括号将动态值括起,值必须后跟一个用 || 分隔的静态回退值。静态值只能包含字母数字字符以及短划线、下划线、点和正斜杠。示例值:<value1>-{.<value2>||"none"}。
    7
    可选:设置生成的消息符合的 RFC。该值可以是 RFC3164RFC5424
    8
    可选:为消息设置严重性级别。如需更多信息,请参阅 Syslog 协议
    9
    可选:为日志转发设置交付模式。该值可以是 AtLeastOnce,也可以是 AtMostOnce
    10
    使用方案指定绝对 URL。有效方案是:tcptlsudp。例如:tls://syslog-receiver.example.com:6514
    11
    指定控制传输层安全(TLS)客户端连接的选项的设置。
    12
    使用管道指定要转发的日志类型:applicationinfrastructureaudit
    13
    为管道指定一个名称。
    14
    服务帐户的名称。
  2. 创建 CR 对象:

    $ oc create -f <filename>.yaml
    Copy to Clipboard Toggle word wrap

1.4.8.1. 在消息输出中添加日志消息

您可以通过将 enrichment 字段添加到 ClusterLogForwarder 自定义资源(CR),将 namespace_namepod_namecontainer_name 元素添加到记录的 message 字段中。

# ...
  spec:
    outputs:
    - name: syslogout
      syslog:
        enrichment: KubernetesMinimal
        facility: user
        payloadKey: message
        rfc: RFC3164
        severity: debug
      type: syslog
      url: tls://syslog-receiver.example.com:6514
    pipelines:
    - inputRefs:
      - application
      name: test-app
      outputRefs:
      - syslogout
# ...
Copy to Clipboard Toggle word wrap
注意

这个配置与 RFC3164 和 RFC5424 兼容。

带有 enrichment: None 的 syslog 信息输出。

 2025-03-03T11:48:01+00:00  example-worker-x  syslogsyslogserverd846bb9b: {...}
Copy to Clipboard Toggle word wrap

带有 enrichment: KubernetesMinimal 的 syslog 信息输出。

2025-03-03T11:48:01+00:00  example-worker-x  syslogsyslogserverd846bb9b: namespace_name=cakephp-project container_name=mysql pod_name=mysql-1-wr96h,message: {...}
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat