Filebeat 日志采集与分析实操教程:过滤清洗 + 结构化处理全流程

日志采集是运维与数据分析的基础,而 Filebeat 作为轻量级采集工具,凭借 “资源占用低、部署简单、稳定性强” 的优势,成为中小规模场景的首选。本文从实际业务出发,详解 Filebeat 部署、多场景日志采集、过滤清洗、结构化处理,以及与 Elasticsearch/Kibana 的联动,新手也能快速上手实现 “杂乱日志→规范数据” 的转化。

一、前期准备:环境与工具适配

1. 系统与硬件要求

  • 系统:CentOS 7/8、Ubuntu 20.04、Windows Server 2019(本文以 CentOS 7 为例)

  • 硬件:CPU≥1 核,内存≥512M(Filebeat 资源占用极低,低配服务器也可运行)

  • 依赖:无额外依赖(Filebeat 为独立二进制文件,无需安装 JDK 等组件)

2. 目标日志场景说明

本文覆盖 3 类常见日志采集场景,适配不同业务需求:

  • 场景 1:Nginx 访问日志(结构化日志,需解析字段)

  • 场景 2:Java 应用日志(非结构化日志,含堆栈信息)

  • 场景 3:多目录日志(如分布式应用的多实例日志)

二、Filebeat 部署与基础配置

1. 解压与目录初始化

\ 解压到/usr/local目录

tar -zxvf filebeat-7.17.10-linux-x86\_64.tar.gz -C /usr/local/

\ 重命名(简化操作)

mv /usr/local/filebeat-7.17.10 /usr/local/filebeat

\ 创建日志与配置备份目录

mkdir -p /usr/local/filebeat/logs

cp /usr/local/filebeat/filebeat.yml /usr/local/filebeat/filebeat.yml.bak

2. 核心配置文件说明(filebeat.yml)

Filebeat 配置核心分为 3 部分:inputs(采集源)、processors(过滤清洗)、outputs(输出目标),基础配置模板如下:

\ 关闭默认采集配置

filebeat.inputs:

\ 全局配置

setup:

  \ 禁用内置模板(自定义索引时关闭)

  template.enabled: false

  \ 日志轮转配置(避免日志过大)

logging:

  level: info

  to\_files: true

  files:

    path: /usr/local/filebeat/logs

    name: filebeat.log

    rotateeverybytes: 10485760   10MB轮转

    keepfiles: 7   保留7天日志

三、多场景日志采集实操

1. 场景 1:Nginx 访问日志采集(结构化解析)

(1)Nginx 日志格式说明(默认格式)

Nginx 访问日志默认格式(/etc/nginx/nginx.conf中定义):

log\_format  main  '\$remote\_addr \$remote\_user \[\$time\_local] "\$request" '

                  '\$status \$body\_bytes\_sent "\$http\_referer" '

                  '"\$http\_user\_agent" "\$http\_x\_forwarded\_for"';

示例日志:192.168.1.1`` - [10/Oct/2024:14:30:00 +0800] "GET /index.html HTTP/1.1" 200 1024 "``https://example.com``" "Mozilla/5.0" "-"

(2)Filebeat 采集配置(inputs 部分)

filebeat.yml中添加 Nginx 日志采集配置:

filebeat.inputs:

\- type: filestream   推荐使用filestream(替代旧版log类型,支持断点续传)

  enabled: true

  paths:

    \- /var/log/nginx/access.log   Nginx访问日志路径

  tags: \["nginx", "access"]   打标签(便于后续过滤)

  fields:   自定义字段(区分环境)

    env: "production"

  parsers:

    \- nginx:   内置Nginx日志解析器(无需手动写grok)

        access: true   解析访问日志

        error: false

2. 场景 2:Java 应用日志采集(非结构化处理)

(1)Java 日志格式说明(Logback 示例)

Java 应用日志(如 Spring Boot)默认非结构化,含时间、级别、类名、日志内容:

2024-10-10 15:00:00.123  INFO 12345 --- \[main] com.example.Application: 应用启动成功,端口:8080

2024-10-10 15:05:00.456 ERROR 12345 --- \[http-nio-8080-exec-1] com.example.Controller: 接口调用失败,参数:{"id":123}

java.lang.NullPointerException: 空指针异常

    at com.example.ServiceImpl.method(ServiceImpl.java:25)

(2)Filebeat 采集配置(含多行日志合并)

Java 堆栈日志跨多行,需配置multiline合并,避免日志断裂:

filebeat.inputs:

\- type: filestream

  enabled: true

  paths:

    - /data/app/logs/application.log   Java应用日志路径

  tags: \["java", "application"]

  fields:

    env: "production"

  parsers:

    - multiline:   多行日志合并配置

        type: pattern   按模式匹配

        pattern: '^\[0-9]{4}-\[0-9]{2}-\[0-9]{2}'   日志起始行模式(日期开头)

        negate: true   非起始行则合并到上一行

        match: after   合并到上一行之后

3. 场景 3:多目录日志采集(分布式应用)

若应用部署多实例(如 3 个 Tomcat 实例),日志分散在不同目录,可通过paths通配符采集:

filebeat.inputs:

\- type: filestream

  enabled: true

  paths:

    - /data/tomcat/tomcat-\*/logs/catalina.out   通配符匹配所有tomcat实例日志

  tags: \["tomcat", "catalina"]

  fields:

    app: "web-service"

四、日志过滤与清洗(processors 核心配置)

采集到的日志常含无用信息(如空行、敏感数据),需通过processors过滤清洗,核心功能包括:删除字段、过滤日志、替换内容、敏感数据脱敏。

1. 基础过滤:删除空行与无用字段

processors:

   删除空行日志

  - drop\_event:

      when:

        equals:

          message: ""   空行直接丢弃

   删除无用字段(如beat版本、主机名等)

  - drop\_fields:

      fields: \["beat.version", "host.architecture", "agent.version"]

      ignore\_missing: true   字段不存在时忽略

2. 条件过滤:只保留关键日志

例如只保留 Nginx 的 4xx/5xx 错误日志、Java 的 ERROR 级别日志:

processors:

   保留Nginx 4xx/5xx错误日志(根据tags筛选)

  - drop\_event:

      when:

        and:

          - has\_fields: \["tags"]

          - contains:

              tags: "nginx"

          - not:

              regexp:

                "nginx.access.response.status": "^\[45]"   只保留4xx/5xx状态码

   保留Java ERROR级别日志

  - drop\_event:

      when:

        and:

          - has\_fields: \["tags"]

          - contains:

              tags: "java"

          - not:

              contains:

                message: "ERROR"   只保留含ERROR的日志

3. 数据脱敏:隐藏敏感信息

日志中可能包含手机号、身份证号等敏感数据,需通过dissectgsub脱敏:

processors:

  \ 手机号脱敏(替换中间4位为\*\*\*\*)

  \- gsub:

      fields:

        \- field: message

          pattern: '1\[3-9]\d{9}'   手机号正则

          replacement: '1\*\*\*\*\*\*\*\d{4}'   脱敏后格式:1\*\*\*\*\*\*\*1234

  \ 身份证号脱敏(保留前6位和后4位)

  \- gsub:

      fields:

        \- field: message

          pattern: '(\d{6})(\d{8})(\d{4})'   身份证号正则(18位)

          replacement: '\1\*\*\*\*\*\*\*\*\3'   脱敏后格式:110101\*\*\*\*\*\*\*\*1234

4. 字段提取:非结构化日志转结构化

对于无内置解析器的日志(如自定义应用日志),用dissect提取字段(比 grok 更简单):

示例自定义日志:2024-10-10 16:00:00 | user=1001 | action=login | status=success

processors:

  \- dissect:

      tokenizer: '%{log\_time} | user=%{user\_id} | action=%{action} | status=%{login\_status}'

      field: message   从message字段提取

      target\_prefix: "app"   提取后字段前缀:app.log\_time、app.user\_id等

五、日志结构化输出(outputs 配置)

Filebeat 支持输出到 Elasticsearch、Logstash、Kafka 等目标,本文重点介绍与 Elasticsearch(直接结构化存储)和控制台(调试用)的配置。

1. 输出到控制台(调试用)

部署初期建议先输出到控制台,验证采集与过滤效果:

output.console:

  enabled: true

  codec.json:

    pretty: true   格式化输出(便于查看)

2. 输出到 Elasticsearch(生产环境)

直接输出到 Elasticsearch,自动创建结构化索引:

output.elasticsearch:

  enabled: true

  hosts: \["http://192.168.1.100:9200"]   Elasticsearch地址

  \ 按日志类型拆分索引(便于管理)

  indices:

    \- index: "nginx-access-log-%{+YYYY.MM.dd}"

      when:

        contains:

          tags: "nginx"

    \- index: "java-app-log-%{+YYYY.MM.dd}"

      when:

        contains:

          tags: "java"

  \ 索引模板(定义字段类型,避免自动映射错误)

  template:

    name: "custom-log-template"

    pattern: "\*"

    overwrite: false

    settings:

      index.number\_of\_shards: 1

      index.number\_of\_replicas: 0

3. 输出到 Logstash(复杂处理场景)

若需更复杂的日志处理(如关联数据库),可先输出到 Logstash:

output.logstash:

  enabled: true

  hosts: \["192.168.1.101:5044"]   Logstash地址

  \ 负载均衡(多Logstash节点时)

  loadbalance: true

  \ 批量发送(提升性能)

  bulk\_max\_size: 1024

  compression\_level: 3   压缩传输(1-9,越高压缩率越高)

六、启动与调试:快速验证效果

1. 启动 Filebeat

\ 后台启动(指定配置文件)

nohup /usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml > /usr/local/filebeat/logs/start.log 2>&1 &

\ 查看启动状态

ps -ef | grep filebeat

2. 调试技巧:快速定位问题

(1)查看 Filebeat 日志

tail -f /usr/local/filebeat/logs/filebeat.log
  • 常见错误:日志路径不存在(检查paths配置)、Elasticsearch 连接失败(检查网络与端口)、配置格式错误(缩进问题,YAML 对缩进敏感)。

(2)测试配置文件语法

/usr/local/filebeat/filebeat test config -c /usr/local/filebeat/filebeat.yml
  • 输出Config OK说明语法无问题,否则会提示错误行号。

(3)验证输出效果

  • 控制台输出:直接查看启动日志tail -f /usr/local/filebeat/logs/start.log,确认日志格式正确。

  • Elasticsearch 验证:访问http://ES_IP:9200/nginx-access-log-2024.10.10/_search,查看是否有结构化日志数据。

七、Kibana 可视化:结构化日志应用

将日志输出到 Elasticsearch 后,可通过 Kibana 实现日志查询、仪表盘制作:

  1. 登录 Kibana→Stack Management→索引模式→创建索引模式(如nginx-access-log-*)。

  2. 进入 Discover 页面,选择创建的索引模式,可按字段筛选(如nginx.access.response.status:404查询 404 错误)、时间范围过滤。

  3. 制作仪表盘:添加饼图(展示不同状态码占比)、折线图(展示访问量趋势),直观监控业务状态。

八、避坑指南:常见问题与解决方案

1. 坑 1:多行日志拆分(Java 堆栈日志断裂)

  • 原因:未配置multiline或模式匹配错误。

  • 解决方案:严格匹配日志起始行格式(如日期格式^[0-9]{4}-[0-9]{2}-[0-9]{2}),测试时先输出到控制台验证。

2. 坑 2:Elasticsearch 字段类型映射错误(如状态码为字符串)

  • 原因:未自定义索引模板,Elasticsearch 自动映射为字符串。

  • 解决方案:在 Elasticsearch 中创建索引模板,指定字段类型(如nginx.access.response.status为整数)。

3. 坑 3:Filebeat 无权限读取日志文件

  • 原因:日志文件权限为600,Filebeat 运行用户无读取权限。

  • 解决方案:修改日志文件权限(chmod 644 /var/log/nginx/access.log),或用 root 用户启动 Filebeat(生产环境建议配置文件权限而非 root 启动)。

4. 坑 4:日志重复采集

  • 原因:sincedb文件丢失(默认存储在/var/lib/filebeat),导致重启后重新采集。

  • 解决方案:指定sincedb路径,避免误删:

filebeat.inputs:

\- type: filestream

  sincedb:

    path: /usr/local/filebeat/data/sincedb   自定义sincedb路径

    enabled: true
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容