如何让 Filebeat 忽略某些容器的日志?

Filebeat 忽略特定容器日志的方法:exclude_files 按文件名排除、drop_event 按内容过滤、autodiscover 条件排除。本文对比三种方案,并介绍观测云 DataKit 的容器日志过滤。

最佳实践
如何让 Filebeat 忽略某些容器的日志?封面

三种常用方式:filestream 的 prospector.scanner.exclude_files 按正则排除路径;drop_event 处理器按事件内容(如容器名、镜像名)丢弃;autodiscover 场景下用条件模板按容器元数据过滤。

方法一:exclude_files 按文件名排除

filebeat.inputs:
  - type: filestream
    id: docker-logs
    parsers:
      - container: ~
    paths:
      - /var/lib/docker/containers/*/*.log
    prospector.scanner.exclude_files:
      - '.*container_to_ignore.*\.log$'

简单直接,但容器日志文件名是容器 ID,不太直观。

方法二:drop_event 按内容过滤

配合 add_docker_metadata 拿到容器名后再丢弃:

filebeat.inputs:
  - type: filestream
    id: docker-logs
    parsers:
      - container: ~
    paths:
      - /var/lib/docker/containers/*/*.log

processors:
  - add_docker_metadata: ~
  - drop_event:
      when:
        or:
          - equals:
              container.name: "my-noisy-container"
          - contains:
              container.image.name: "debug-image"

元数据必须先成功补齐,才可按实际字段过滤;Docker socket 访问需控制权限。三个方案是替代选择,别为同一文件同时启用多个输入造成重复采集。

方法三:autodiscover 条件排除

K8s 环境下用 autodiscover 时,在条件里排除特定 namespace 或 label 的 Pod:

filebeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        - condition:
            not:
              equals:
                kubernetes.namespace: "kube-system"
          config:
            - type: filestream
              id: container-${data.kubernetes.container.id}
              prospector.scanner.symlinks: true
              parsers:
                - container: ~
              paths:
                - /var/log/containers/*-${data.kubernetes.container.id}.log

常见问题(FAQ)

Q:exclude_files 的正则有什么注意事项?
A:匹配的是文件的完整路径,写模式时注意路径前缀;Windows 和 Linux 路径分隔符不同。

Q:drop_event 是在哪里发生的?
A:在 Filebeat 进程内、发送到下游之前,被丢弃的事件不占用网络带宽和存储。

Q:K8s 里按 label 过滤怎么写?
A:autodiscover 的 condition 支持 kubernetes.labels.xxx。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台