在隔离内网机器上使用 Filebeat 全量采集日志并推送到 ELK 的实战
·
在生产环境中,我们经常遇到 隔离内网服务器,无法直接访问内部 ELK 集群的情况。例如,数据中心的 115 机器无法直接访问 ES 内网端口,只能通过 nginx 公网代理访问 ELK。本文记录了从零开始配置 Filebeat,实现全量日志采集、推送到 ELK,并在 Kibana 完整展示日志的实战过程。
一、问题背景
- 环境:
- 数据中心 115 机器,Linux(麒麟 V10)
- 日志路径:
/data/services/icbc-epay/logs1/*.log、logs2/*.log - 单日日志量:500MB+
- 内网与 ELK(阿里云部署)不通,只能访问 nginx 公网代理域名
- Kibana 公网访问域名:
https://kibana.xxx.com
- 目标:
- 使用 Filebeat 采集 115 机器日志。
- 推送到 ELK Elasticsearch,建立每日索引。
- 在 Kibana Discover 中完整查看多行堆栈日志。
- 保证旧日志也能被采集。
二、遇到的问题
- Filebeat 版本 8.11 默认创建数据流索引
.ds-*- 数据流默认只显示时间戳和 agent 信息,多行日志
_source不展开。 - 导致 Discover 页面字段为空或者只显示少量日志。
- 数据流默认只显示时间戳和 agent 信息,多行日志
- 日志显示不全
- 日志堆栈是多行,需要使用
multiline配置。 - 旧日志已被 Filebeat registry 记录,修改 multiline 后需要重采集。
- 日志堆栈是多行,需要使用
- Filebeat 服务启动失败
- 由于
/var/lib/filebeat/filebeat.lock被占用,多次重启失败。 - 需清理 registry 或停止已有 Filebeat 进程。
- 由于
三、解决方案
1. Filebeat 安装与基础配置
确保 Filebeat 已安装:
sudo rpm -ivh filebeat-8.11.2-x86_64.rpm # 或者使用 apt/yum 安装
创建 Filebeat 配置 /etc/filebeat/filebeat.yml,核心配置如下:
filebeat.inputs:
- type: log
enabled: true
paths:
- /data/services/icbc-epay/logs1/*.log
- /data/services/icbc-epay/logs2/*.log
multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
# 全量采集日志,不做过滤
#processors: []
# 禁用 ILM
setup.ilm.enabled: false
setup.ilm.overwrite: false
setup.template.enabled: false
# 输出到 ES 普通索引
output.elasticsearch:
hosts: ["https://kibana.XXXX.com:443/es"]
username: "elastic"
password: "YOUR_PASSWORD"
ssl.verification_mode: none
bulk_max_size: 500
index: "filebeat-115-%{+yyyy.MM.dd}"
# 可选配置 Kibana,用于 Dashboard
setup.kibana:
hosts: ["https://kibana.XXXX.com"]
username: "elastic"
password: "YOUR_PASSWORD"
ssl.verification_mode: none
说明:
multiline.pattern: '^\['用于将多行堆栈日志合并为一条事件。setup.ilm.enabled: false禁用 ILM,避免数据流索引。- 输出索引使用普通索引,每天一个索引,便于在 Discover 查看全量日志。
2. 清理旧 registry,保证 multiline 生效
Filebeat 会记录每个日志文件的读取位置(registry),修改 multiline 后,需要重采集旧日志:
sudo systemctl stop filebeat
sudo mv /var/lib/filebeat/registry/filebeat /var/lib/filebeat/registry/filebeat.bak
sudo systemctl start filebeat
注意:大日志量重采集可能耗时较长。
3. 测试配置和输出
- 测试 Filebeat 配置:
filebeat test config -c /etc/filebeat/filebeat.yml
- 测试 Elasticsearch 输出:
filebeat test output -c /etc/filebeat/filebeat.yml
确认输出:
dial up... OK
TLS... handshake... OK
talk to server... OK
version: 7.17.23
4. 启动 Filebeat 服务
sudo systemctl enable filebeat
sudo systemctl start filebeat
sudo journalctl -u filebeat -f
- 查看 harvester 是否启动:
Harvester started for paths: [/data/services/icbc-epay/logs1/*.log /data/services/icbc-epay/logs2/*.log]
5. 验证日志是否推送成功
- 查询索引:
curl -u elastic:YOUR_PASSWORD -k https://kibana.XXXX.com/es/_cat/indices?v | grep filebeat
输出示例:
green open filebeat-8.11.2
yellow open filebeat-115-2026.06.12 1 1 3 192.2kb
- 查询日志条数:
curl -u elastic:YOUR_PASSWORD -k https://kibana.XXXX.com/es/filebeat-115-2026.06.12/_count
6. Kibana 配置
- 在 Stack Management → Index Patterns 中,创建新的 Index Pattern:
- 输入:
filebeat-115-* - 时间字段选择:
@timestamp - 刷新字段列表
- 输入:
- 在 Discover 页面就可以看到全量日志:
- 多行堆栈日志会被正确合并
_source可展开查看完整日志内容
7. 总结与经验
- 数据流索引与普通索引区别:
数据流默认只显示 agent/timestamp,原始日志字段不展示。若要在 Discover 查看全量日志,推荐使用普通索引。 - multiline 生效条件:
修改 multiline 配置后必须清理 registry 或新日志才能生效。 - Filebeat 服务启动失败:
- 错误提示
/var/lib/filebeat/filebeat.lock被占用 → 停止旧进程或清理 registry。 - 配置冲突或多 output 配置 → 确保
filebeat.yml只配置一次 output。
- 错误提示
- 大日志量采集优化:
- 设置
bulk_max_size: 500,避免小批量频繁发送。 - 设置 nginx 代理
client_max_body_size足够大,保证日志批量提交不被拒绝。
- 设置
通过以上步骤,隔离内网的 115 机器已经可以完整采集日志、推送到 ELK,并在 Kibana Discover 全量查看日志,支持堆栈合并和多文件采集。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)