Skip to content

Logstash

Filebeat.yml

Logstash.yml

数据流 根据label自动区分

方案 1:通过 Filebeat Autodiscover动态设置字段

在 Filebeat 的配置文件(filebeat.yml)中,启用 autodiscover 并动态设置字段:

yaml
filebeat.autodiscover:
  providers:
  - type: kubernetes
    # Kubernetes API 的访问配置,确保 Filebeat 能访问 K8s 集群
    hints.enabled: true
    # 仅采集带有特定标签的 Pod 日志
    templates:
      # - condition:
      #     equals:
      #       kubernetes.labels.log: "true"  # 只处理带有标签 log=true 的 Pod
      - config:
          - type: container
            paths:
              - /var/log/containers/*-${data.kubernetes.container.id}.log
            multiline:
              pattern: '^\d{4}-\d{2}-\d{2}'  # 多行日志的正则匹配(例如 Java 堆栈)
              negate: true
              match: after
            processors:
              - add_kubernetes_metadata:
                  in_cluster: true  # 自动添加 Kubernetes 元数据
              - dissect:
                tokenizer: "%{kubernetes.labels.app}"  # 动态从 Pod 的 labels 中获取日志分类 例如pod标签为app:nginx则会取nginx
                field: "app"  #此处命名与下面dataset中一致
              - add_fields:
                target: "data_stream"
                fields:
                  dataset: "${data.app:generic}"  # 动态从 label 中获取 dataset
                  type: "default"
              - drop_fields:
                  fields: ["host"]  # 可根据需要移除不必要的字段

通过给 Pod 添加 labels,Filebeat 会自动将日志分类到不同的 Data Stream 中。例如:

yaml
apiVersion: v1
kind: Pod
metadata:
  name: tomcat-pod
  labels:
    app: tomcat   # 动态分类所使用的字段
spec:
  containers:
    - name: tomcat
      image: tomcat:latest
      ports:
        - containerPort: 8080

数据流命名规则示例 当日志由 Filebeat 发送到 Logstash 或 Elasticsearch 时:

  • Pod 的 log_category 标签值为 tomcat 时: 数据流名为:logs-tomcat-default
  • Pod 未设置 log_category 标签时: 数据流名为:logs-generic-default

方案 2:通过 Logstash 动态处理日志分类

如果使用 Logstash 作为日志转发器,可以在 Logstash 中动态处理来自 Filebeat 的日志,基于日志的内容或字段(如 kubernetes.labels)来自动分配 data_stream.dataset

filter {
  if [kubernetes][labels][log_category] {
    mutate {
      add_field => { "data_stream.dataset" => "%{[kubernetes][labels][log_category]}" }
    }
  } else {
    mutate {
      add_field => { "data_stream.dataset" => "generic" }
    }
  }

  mutate {
    add_field => { "data_stream.namespace" => "logs" }
    add_field => { "data_stream.type" => "default" }
  }
}

注意事项

  • ES8以上默认使用Index Pattern