日志采集是运维与数据分析的基础,而 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. 数据脱敏:隐藏敏感信息
日志中可能包含手机号、身份证号等敏感数据,需通过dissect或gsub脱敏:
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 实现日志查询、仪表盘制作:
登录 Kibana→Stack Management→索引模式→创建索引模式(如
nginx-access-log-*)。进入 Discover 页面,选择创建的索引模式,可按字段筛选(如
nginx.access.response.status:404查询 404 错误)、时间范围过滤。制作仪表盘:添加饼图(展示不同状态码占比)、折线图(展示访问量趋势),直观监控业务状态。
八、避坑指南:常见问题与解决方案
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