温馨提示×

如何自定义Filebeat日志格式

小樊
44
2025-12-14 19:04:31
栏目: 编程语言

Filebeat日志格式自定义指南

一 概念澄清

  • Filebeat自身运行日志:指 Filebeat 进程打印到磁盘或控制台的日志,便于运维排错。可切换为plainjson两种格式,并配置日志轮转与保留。
  • 被采集的业务日志内容:指 Filebeat 从文件/流中读取并发送的事件。可通过processors(如 dissect、grok、mutate)解析与重构字段,或在输出阶段添加元数据字段,从而控制进入 Elasticsearch/Logstash 的最终结构。

二 自定义Filebeat自身运行日志格式

  • 修改 filebeat.yml 的 logging 段,选择输出格式为 plainjson,并设置日志路径、保留天数与权限。
  • 示例(JSON 格式,便于机器解析):
    logging:
      level: info
      to_files: true
      files:
        path: /var/log/filebeat
        name: filebeat.log
        keepfiles: 7
        permissions: 0640
      format: json
    
  • 应用与验证:
    • 重启服务:Linux 执行:sudo systemctl restart filebeat
    • 查看自身日志:sudo tail -f /var/log/filebeat/filebeat.log
    • Windows:通过“服务”管理器重启 Filebeat 服务,并查看安装目录下的日志文件。

三 自定义被采集日志的事件结构与内容

  • 添加元数据字段(放在事件根层级或命名空间下)
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/*.log
      fields:
        env: prod
        app: order-service
      fields_under_root: false   # 设为 true 时,fields 将提升到事件根层级
    
  • 解析与重构日志内容(示例:按自定义模式拆解 message)
    processors:
    - dissect:
        tokenizer: "[%{timestamp}] -%{parentTraceId} -%{traceId} -%{host} -%{port} -%{appName} -%{pid} -[%{level}] -[%{thread}] -%{class} -%{line} - %{message}"
        field: "message"
        target_prefix: ""
    - convert:
        fields:
          - {from: timestamp, to: "@timestamp", type: date, formats: ["yyyy-MM-dd HH:mm:ss.SSS"]}
    - drop_fields:
        fields: ["message", "timestamp"]   # 解析后可删除原始字段
    
  • 多行日志合并(如 Java 堆栈)
    filebeat.inputs:
    - type: filestream
      enabled: true
      paths:
        - /var/log/app/*.log
      parsers:
        - multiline:
            type: pattern
            pattern: '^\['
            negate: true
            match: after
    
  • 输出到 Elasticsearch 时控制索引名与模板
    output.elasticsearch:
      hosts: ["localhost:9200"]
      index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
      # 如需自定义模板可在 setup.template 下调整
    
  • 应用与验证:
    • 重启 Filebeat:sudo systemctl restart filebeat
    • 在 ES 中检索验证:curl -X GET "localhost:9200/filebeat-*/_search?pretty"

四 常见问题与排查

  • 缩进与语法:YAML 对缩进敏感,层级错误会导致配置不生效;建议用 filebeat test config -c filebeat.yml 校验。
  • 多行合并不生效:确认 multiline 配置位于正确的输入(如 filestream 的 parsers 下),并匹配你的日志首行特征。
  • 字段覆盖与类型:使用 convert 处理时间/数值类型;避免用同名覆盖关键字段(如 @timestamp)。
  • 自身日志看不到:确认 logging.to_files: truepath/permissions 正确;必要时提高 level: debug 临时排查。

0