Skip to content

使用

docker 采集日志

配置文件

yaml
# ====================== 【全局采集配置】 ======================
filebeat.inputs:
    - type: filestream
      enabled: true
      paths:
          - /app-logs/*.log

      parsers:
          # 第一步:先合并多行异常堆栈
          - multiline:
                type: pattern
                pattern: '^\{"level"'
                negate: true
                match: after
                max_lines: 1000 # 单次最多合并1000行堆栈,防止内存溢出
                timeout: 5s # 5秒无新行就强制提交本条日志
          # 第二步:再解析单行JSON日志
          - ndjson:
                overwrite_keys: true
                add_error_key: true
                ignore_decoding_error: false
      # 全局自定义标签,平铺到日志根字段
      fields:
          service_name: backend-api
          env: local
          project: base
      fields_under_root: true

      # 文件扫描&回收策略
      scan_frequency: 1s
      backoff.init: 1s
      backoff.max: 10s
      close_inactive: 5m
      ignore_older: 72h

# ====================== 输出至ES配置 ======================
output.elasticsearch:
    # 和docker-compose中ES的service名称保持一致,你的compose写es就填es
    hosts: ['http://elasticsearch:9200']
    username: elastic
    password: NQjwVTUbVtJTUgDV
    index: 'backend-api-log-%{+YYYY.MM.dd}'
    bulk_max_size: 1000
    flush.min_events: 200
    flush.timeout: 1s

# 可选配置
setup.template.enabled: false
setup.template.overwrite: false

docker启动

yaml
elasticsearch:
    image: elasticsearch:8.19.19
    container_name: elasticsearch
    restart: always
    ports:
      - "9200:9200"
    environment:
      - TZ=Asia/Shanghai
      # 容器启动自动设置elastic密码
      - ELASTIC_PASSWORD=NQjwVTUbVtJTUgDV
      # 单节点模式,不开启集群发现
      - discovery.type=single-node
      # 开启ES日志记录,方便排查问题
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      # 关键:关闭http的ssl认证,允许http访问(开发必备)
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      # 节点间通信ssl关闭(单节点)
      - xpack.security.transport.ssl.enabled=false
    volumes:
      - ./volumes/elasticsearch/data:/usr/share/elasticsearch/data

  kibana:
    image: kibana:8.19.19
    container_name: kibana
    restart: always
    ports:
      - "5601:5601"
    environment:
      - TZ=Asia/Shanghai
      - I18N_LOCALE=zh-CN # 固定中文
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      # # 配置访问ES的账号密码
      - ELASTICSEARCH_USERNAME=kibana
      - ELASTICSEARCH_PASSWORD=ykrh7FiNPn4CXqYbcrQ=
      # 关闭kibana内部ssl
      - XPACK_SECURITY_ENCRYPTIONKEYS_ENCRYPTEDKEYS=development
    depends_on:
      - elasticsearch

  filebeat:
    image: elastic/filebeat:8.19.19
    container_name: filebeat
    user: root
    environment:
      - TZ=Asia/Shanghai
    volumes:
      # 挂载filebeat配置文件(宿主机新建filebeat.yml)
      - ./volumes/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      # 挂载你的go-zero项目日志目录(修改为你真实项目绝对路径)
      - /app/backend/api/logs:/app-logs:ro
    depends_on:
      - elasticsearch

k8s 采集日志

  • 需要k8s相关知识

namespace

yaml
apiVersion: v1
kind: Namespace
metadata:
    name: logging

configMap

yaml
apiVersion: v1
kind: ConfigMap
metadata:
    name: filebeat-config
    namespace: logging
    labels:
        app: filebeat
data:
    filebeat.yml: |
        filebeat.inputs:
          # 类型:容器日志采集
          - type: container
            # K8s标准容器日志路径
            paths:
              - /var/log/containers/*article-rpc*.log # 采集文章服务日志
              - /var/log/containers/*backend-api*.log # 采集后端服务日志
            # 1.先做多行合并(异常堆栈合并)
            multiline.type: pattern
            multiline.pattern: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
            multiline.negate: true
            multiline.match: after
            multiline.max_lines: 300
            # 2. 解决多行多个JSON解析报错
            parsers:
              - ndjson:
                  overwrite_keys: true
                  add_error_key: true
                  # 一行多个json自动切割拆分
                  split_message: true
            # 输入内处理器:注入k8s元数据(修正缩进)
            processors:
              - add_kubernetes_metadata:
                  host: ${NODE_NAME}
                  matchers:
                    - logs_path:
                        logs_path: "/var/log/containers/"
            ignore_older: 72h
            scan_frequency: 10s

        # ===================== 全局处理器流水线(清洗、过滤、打标) =====================
        processors:
          # 1、解析容器外层JSON结构
          - decode_json_fields:
              fields: [ "message" ]
              target: ""
              overwrite_keys: true
              add_error_key: true

          # 2、剔除无用字段(独立一条)
          - drop_fields:
              fields: [ "agent", "input", "prospector", "ecs" ]
              ignore_missing: true

          # 3、添加自定义环境标签(独立一条)
          - add_fields:
              fields:
                env: "test"
                log_source: "k8s_stdout"

        #==================== 采集偏移持久化(断点续传) ====================
        filebeat.registry.path: /var/lib/filebeat/registry
        filebeat.registry.flush: 1s
        filebeat.shutdown_timeout: 10s

        #==================== 输出ES ====================
        output.elasticsearch:
          hosts:
            # 方便测试,用本机的,正式环境要改啊
            - "http://192.168.0.104:9200"
          index: "k8s-node-logs-%{+YYYY.MM.dd}"
          username: elastic
          password: "NQjwVTUbVtJTUgDV"
          bulk_max_size: 1024
          compression_level: 5
          timeout: 90s

        # ES索引模板自动创建
        setup.template.enabled: true
        setup.template.name: "k8s-logs-template"
        setup.template.pattern: "k8s-logs-*"


        # 对外开放5066监控接口(探针、stats查看必备)
        http.enabled: true
        http.host: 0.0.0.0
        http.port: 5066

DaemonSet

yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
    name: filebeat
    namespace: logging
    labels:
        app: filebeat-stdout
spec:
    selector:
        matchLabels:
            app: filebeat-stdout
    template:
        metadata:
            labels:
                app: filebeat-stdout
        spec:
            serviceAccountName: filebeat
            securityContext:
                runAsUser: 0
            # 容忍master节点污点,采集所有节点日志
            tolerations:
                - key: node-role.kubernetes.io/control-plane
                  operator: Exists
                  effect: NoSchedule
                - key: node-role.kubernetes.io/master
                  operator: Exists
                  effect: NoSchedule
            volumes:
                - name: config-volume
                  configMap:
                      name: filebeat-config
                # 宿主机stdout日志目录
                - name: var-log-containers
                  hostPath:
                      path: /var/log/containers
                      type: Directory
                - name: var-log-pods
                  hostPath:
                      path: /var/log/pods
                      type: Directory
                # offset持久化目录
                - name: data-volume
                  hostPath:
                      path: /var/lib/filebeat-registry
                      type: DirectoryOrCreate
            containers:
                - name: filebeat
                  image: docker.elastic.co/beats/filebeat:8.19.19
                  imagePullPolicy: IfNotPresent
                  args:
                      - '-c'
                      - '/etc/filebeat/filebeat.yml'
                      - '-e' # 打印filebeat自身运行日志,方便排查问题
                  env:
                      # 注入当前节点名称,配置中${NODE_NAME}使用
                      - name: NODE_NAME
                        valueFrom:
                            fieldRef:
                                fieldPath: spec.nodeName
                  # 资源限制,根据集群节点配置调整
                  resources:
                      requests:
                          cpu: 100m
                          memory: 256Mi
                      limits:
                          cpu: 500m
                          memory: 512Mi
                  volumeMounts:
                      # 挂载filebeat配置文件
                      - name: config-volume
                        mountPath: /etc/filebeat
                        readOnly: true
                      # 挂载stdout日志软链目录
                      - name: var-log-containers
                        mountPath: /var/log/containers
                        readOnly: true
                      # 补上pod目录挂载
                      - name: var-log-pods
                        mountPath: /var/log/pods
                        readOnly: true
                      # 持久化采集偏移数据,防止offset丢失
                      - name: data-volume
                        mountPath: /var/lib/filebeat
                  # 新增探针(必须filebeat.yml开启5066端口才生效)
                  livenessProbe:
                      httpGet:
                          path: /stats
                          port: 5066
                      initialDelaySeconds: 20
                      periodSeconds: 10
                      timeoutSeconds: 5
                  readinessProbe:
                      httpGet:
                          path: /stats
                          port: 5066
                      initialDelaySeconds: 5
                      periodSeconds: 5
                      timeoutSeconds: 3