filebeat
1.安装包安装Filebeat 安装配置
一、安装 Filebeat
- Debian/Ubuntu(apt)
# 导入Elastic GPG密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# 添加Filebeat仓库
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic.list > /dev/null
# 安装Filebeat
sudo apt update && sudo apt install filebeat -y
- CentOS/RHEL(yum/dnf)
# 添加Elastic仓库
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
echo "[elastic-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md" | sudo tee /etc/yum.repos.d/elastic.repo > /dev/null
# 安装Filebeat(CentOS 7用yum,CentOS 8+用dnf)
sudo dnf install filebeat -y # 或 sudo yum install filebeat -y
- 通用方式(tar 包,适用于所有 Linux)
# 下载对应版本(以8.11.0为例,可替换为最新版本)
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.11.0-linux-x86_64.tar.gz
# 解压
tar -zxvf filebeat-8.11.0-linux-x86_64.tar.gz
cd filebeat-8.11.0-linux-x86_64
二、配置 Filebeat(核心步骤)
- Filebeat 的配置文件为filebeat.yml(包管理器安装路径:/etc/filebeat/filebeat.yml;tar 包路径:解压目录下)。 核心配置包括 3 部分:日志输入(inputs)、日志过滤(processors)、输出到 ES(output)
- 备份默认配置
sudo cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak # 包管理器安装
# 或(tar包):cp filebeat.yml filebeat.yml.bak
- 编辑配置文件
sudo vim /etc/filebeat/filebeat.yml # 包管理器安装
# 或(tar包):vim filebeat.yml
- 配置日志输入(inputs) 指定 Go 程序日志文件/path/to/sursen-admin.log(替换为实际路径,如/var/log/sursen-admin.log),并根据日志格式开启解析(如 JSON 格式需特殊处理)。
filebeat.inputs:
- type: log # 输入类型为日志文件
enabled: true # 启用该输入
paths:
- /path/to/sursen-admin.log # 替换为你的日志文件绝对路径
# 若日志是JSON格式(如Go程序用zap/json格式输出),需开启JSON解析
json:
keys_under_root: true # 将JSON字段解析到根级别(方便后续过滤)
overwrite_keys: true # 覆盖默认字段(如message)
# 排除空行(可选)
exclude_lines: ['^$']
# 只监控新日志(避免历史日志重复上传,首次运行可注释)
# ignore_older: 0
- 如果日志是非 JSON 格式(如普通文本,包含时间、级别、内容),可跳过json配置,后续用grok解析字段(见过滤部分)。
- 配置日志过滤(processors) 场景 1:保留包含特定关键词的日志(如 "error"、"warning")
processors:
# 丢弃不包含"error"或"warning"的日志(保留符合条件的)
- drop_event:
when:
not:
or:
- contains:
message: "error" # 日志内容包含"error"
- contains:
message: "warning" # 日志内容包含"warning"
场景 2:根据日志级别过滤(适用于结构化日志,如 JSON 中有 "level" 字段) 若 Go 程序日志是 JSON 格式,且包含level字段(如level: "ERROR"),保留ERROR和WARN级别:
processors:
- drop_event:
when:
not:
or:
- equals:
level: "ERROR" # 匹配level字段为ERROR
- equals:
level: "WARN" # 匹配level字段为WARN
场景 3:非 JSON 日志解析后过滤(用 grok 提取字段) 如果日志是文本格式(如2023-10-01 12:00:00 [ERROR] user login failed),先用grok提取级别字段,再过滤:
processors:
# 第一步:用grok解析日志,提取"log_level"字段
- grok:
field: message
patterns:
- '%{TIMESTAMP_ISO8601:log_time} \[%{LOGLEVEL:log_level}\] %{GREEDYDATA:log_message}'
ignore_missing: false # 解析失败的日志会被标记(可选丢弃)
# 第二步:只保留log_level为ERROR/WARN的日志
- drop_event:
when:
not:
or:
- equals:
log_level: "ERROR"
- equals:
log_level: "WARN"
- 配置输出到 Elasticsearch
# 禁用默认输出(如elasticsearch),只保留我们的配置
output.elasticsearch:
hosts: ["http://es-ip:9200"] # 替换为你的ES地址(多个用逗号分隔)
# 若ES开启了账号密码认证(如Elasticsearch 8.x默认开启)
username: "elastic" # 替换为你的ES用户名
password: "your-es-password" # 替换为你的ES密码
# 若ES启用了HTTPS(如默认的9200是HTTP,9243是HTTPS)
# protocol: "https"
# 配置索引名称(自定义,如"sursen-admin-logs-%{+yyyy.MM.dd}"按天分割)
index: "sursen-admin-logs-%{+yyyy.MM.dd}"
# 若ES有索引生命周期管理(ILM),可启用(可选)
# ilm.enabled: true
# 可选:配置Kibana(如果需要在Kibana中查看索引模式,可忽略)
# setup.kibana:
# host: "http://kibana-ip:5601"
三、验证配置并启动 Filebeat
- 测试配置文件是否正确
sudo filebeat test config -c /etc/filebeat/filebeat.yml # 包管理器安装
# 或(tar包):./filebeat test config -c filebeat.yml
# 输出Config OK表示配置正确。
- 测试 ES 连接(可选)
sudo filebeat test output -c /etc/filebeat/filebeat.yml # 包管理器安装
# 或(tar包):./filebeat test output -c filebeat.yml
# 输出SUCCESS表示 ES 连接正常。
- 启动 Filebeat 并设置开机自启
# 包管理器安装(systemd)
sudo systemctl start filebeat
sudo systemctl enable filebeat # 开机自启
sudo systemctl status filebeat # 查看状态
# tar包安装(后台运行)
nohup ./filebeat -c filebeat.yml &
2.Docker 启动 Filebeat 的步骤
-
准备 Filebeat 配置文件 首先需要在宿主机上创建 Filebeat 的配置文件(如filebeat.yml),内容参考之前的配置(日志输入、过滤、输出到 ES),重点注意:
日志文件路径:由于 Docker 容器内需要访问宿主机的/path/to/sursen-admin.log,需通过目录挂载让容器可见(容器内路径可自定义,如/var/log/sursen-admin.log)。 ES 地址:若 ES 在宿主机,容器内访问宿主机的 IP 需用宿主机局域网 IP(或host.docker.internal,仅 Windows/macOS 的 Docker 支持);若 ES 也是 Docker 容器,需确保在同一网络。
-
编写配置文件示例(filebeat.yml)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/sursen-admin.log # 容器内的日志路径(需与挂载的宿主机路径对应)
processors:
# 按需求配置过滤规则(如保留ERROR级别日志)
- drop_event:
when:
not:
equals:
level: "ERROR" # 假设日志是JSON格式,包含level字段
output.elasticsearch:
hosts: ["http://es-ip:9200"] # ES地址(容器内可访问的地址)
username: "elastic"
password: "your-es-password"
index: "sursen-admin-logs-%{+yyyy.MM.dd}"
# 可选:Kibana配置(见第二部分解释)
# setup.kibana:
# host: "http://kibana-ip:5601"
- 启动 Filebeat 容器 使用docker run命令,通过-v挂载宿主机的配 置文件和日志文件到容器内,确保容器能读取配置和日志:
docker run -d \
--name filebeat \
--restart=always \ # 开机自启
-v /path/to/your/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro \ # 挂载配置文件(只读)
-v /path/to/host/sursen-admin.log:/var/log/sursen-admin.log:ro \ # 挂载宿主机日志到容器内路径(需与配置中paths一致)
docker.elastic.co/beats/filebeat:8.11.0 # 镜像版本(与ES版本保持一致)
-
参数说明:
- --name filebeat:指定容器名称。
- -v 宿主机路径:容器内路径:挂载配置文件(确保容器使用自定义配置)和日志文件(确保 Filebeat 能读取日志)。
- docker.elastic.co/beats/filebeat:8.11.0:官方 Filebeat 镜像(版本需与 ES 兼容,建议相同主版本)。
- 验证容器状态
docker ps | grep filebeat # 查看容器是否运行
docker logs -f filebeat # 查看容器日志,排查错误(如配置错误、ES连接失败)
3.Docker-compose 方式
场景 1:仅部署 Filebeat(连接外部 ES/Kibana)
version: '3.8'
services:
filebeat:
image: docker.elastic.co/beats/filebeat:8.6.2 # 镜像版本与ES一致
container_name: filebeat
restart: always # 容器退出后自动重启
user: root # 临时使用root用户(避免权限问题,生产环境可按需调整)
volumes:
# 挂载宿主机的Filebeat配置文件到容器内(覆盖默认配置)
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
# 挂载宿主机的日志文件到容器内(需与filebeat.yml中配置的paths一致)
- /path/to/host/sursen-admin.log:/var/log/sursen-admin.log:ro
# 挂载Filebeat数据目录(保存日志读取进度,避免重启后重复采集)
- filebeat-data:/usr/share/filebeat/data
# 若ES/Kibana在宿主机,可添加网络模式(可选,根据实际环境调整)
# network_mode: host # 容器使用宿主机网络(直接访问宿主机的127.0.0.1)
networks:
- elastic-network # 自定义网络(若需要与其他容器通信)
volumes:
filebeat-data: # 持久化Filebeat数据(如日志读取偏移量)
networks:
elastic-network: # 自定义网络(可选,用于与ES/Kibana容器互通)
- 编写 filebeat.yml 配置文件
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/sursen-admin.log # 容器内的日志路径(与docker-compose挂载对应)
# 日志过滤规则(根据需求调整,如保留ERROR级别)
processors:
- drop_event:
when:
not:
equals:
level: "ERROR" # 假设日志是JSON格式,包含level字段
output.elasticsearch:
hosts: ["http://外部ES的IP:9200"] # 外部ES的地址(如宿主机IP:9200)
# 若ES开启安全验证,添加账号密码
# username: "elastic"
# password: "your-password"
index: "sursen-admin-logs-%{+yyyy.MM.dd}"
# 若需连接外部Kibana,取消注释并配置
# setup.kibana:
# host: "http://外部Kibana的IP:5601"
场景 2:同时部署 Filebeat + ES + Kibana(完整栈)
version: '3.8'
services:
# Elasticsearch服务
es:
image: docker.elastic.co/elasticsearch/elasticsearch:8.6.2
container_name: es
restart: always
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node # 单节点模式(测试用)
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 调整JVM内存
- xpack.security.enabled=false # 关闭安全验证(测试用,生产环境需开启)
ports:
- "9200:9200"
volumes:
- es-data:/usr/share/elasticsearch/data
networks:
- elastic-network
# Kibana服务(版本必须与ES一致)
kibana:
image: docker.elastic.co/kibana/kibana:8.6.2
container_name: kibana
restart: always
environment:
- ELASTICSEARCH_HOSTS=http://es:9200 # 连接同一网络的ES服务(用服务名访问)
ports:
- "5601:5601"
depends_on:
- es # 等待ES启动后再启动Kibana
networks:
- elastic-network
# Filebeat服务
filebeat:
image: docker.elastic.co/beats/filebeat:8.6.2
container_name: filebeat
restart: always
user: root
volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
- /path/to/host/sursen-admin.log:/var/log/sursen-admin.log:ro # 挂载宿主机日志
- filebeat-data:/usr/share/filebeat/data
depends_on:
- es # 等待ES启动后再启动Filebeat
networks:
- elastic-network
volumes:
es-data:
filebeat-data:
networks:
elastic-network:
- 由于在同一 elastic-network 网络中,可直接通过服务名访问 ES/Kibana:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/sursen-admin.log # 容器内日志路径
processors:
- drop_event:
when:
not:
equals:
level: "ERROR"
output.elasticsearch:
hosts: ["http://es:9200"] # 用ES服务名访问(同一网络内自动解析)
index: "sursen-admin-logs-%{+yyyy.MM.dd}"
# 连接同一网络的Kibana(自动创建索引模式)
setup.kibana:
host: "http://kibana:5601" # 用Kibana服务名访问
目录建议
目录建议
es-stack/
├── docker-compose.yml # 定义 Filebeat 和 Kibana 服务
├── filebeat/
│ └── filebeat.yml # Filebeat 核心配置
└── kibana/
└── kibana.yml # Kibana 配置(可选,也可通过环境变量配置)
Filebeat kibana 一起安装 docker-compose
version: '3.8'
services:
# Kibana 服务(连接本地 ES)
kibana:
image: docker.elastic.co/kibana/kibana:8.6.2 # 版本与 ES 一致
container_name: kibana
restart: always
environment:
# 连接本地 ES:需替换为宿主机的局域网 IP(如 192.168.1.100)
- ELASTICSEARCH_HOSTS=http://192.168.1.100:9200
# 若 ES 启用了安全认证(8.x 默认启用),需添加账号密码
- ELASTICSEARCH_USERNAME=elastic
- ELASTICSEARCH_PASSWORD=你的ES密码
ports:
- "5601:5601" # 宿主机 5601 端口映射到容器,可通过 http://宿主机IP:5601 访问 Kibana
networks:
- es-network
# Filebeat 服务(采集日志并发送到本地 ES)
filebeat:
image: docker.elastic.co/beats/filebeat:8.6.2 # 版本与 ES 一致
container_name: filebeat
restart: always
user: root # 临时用 root 权限(避免容器无法读取宿主机日志/配置)
volumes:
# 挂载 Filebeat 配置文件(宿主机 ./filebeat/filebeat.yml → 容器内默认路径)
- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
# 挂载宿主机日志文件(需与 filebeat.yml 中配置的路径一致)
- /var/log/sursen-admin.log:/var/log/sursen-admin.log:ro
# 持久化 Filebeat 数据(保存日志读取进度,避免重复采集)
- filebeat-data:/usr/share/filebeat/data
# 若 ES 启用了 TLS 加密,需挂载 ES 的 CA 证书(如 /etc/elasticsearch/certs/http_ca.crt)
# - /etc/elasticsearch/certs/http_ca.crt:/usr/share/filebeat/certs/http_ca.crt:ro
networks:
- es-network
volumes:
filebeat-data: # 持久化 Filebeat 读取进度
networks:
es-network: # 自定义网络,确保容器间通信(此处主要用于统一网络环境)
- Filebeat(filebeat/filebeat.yml)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/sursen-admin.log # 容器内日志路径(与 docker-compose 挂载的宿主机路径对应)
# 若日志是 JSON 格式(如 Go 程序用 zap 输出 JSON),开启解析
json:
keys_under_root: true
overwrite_keys: true
# 日志过滤规则(示例:保留 level 为 ERROR 或 WARN 的日志)
processors:
- drop_event:
when:
not:
or:
- equals:
level: "ERROR"
- equals:
level: "WARN"
# 输出到本地 ES
output.elasticsearch:
# 宿主机局域网 IP(与 Kibana 配置的 ES 地址一致)
hosts: ["http://192.168.1.100:9200"]
# 若 ES 启用认证,添加账号密码
username: "elastic"
password: "你的ES密码"
# 若 ES 启用了 TLS(8.x 默认启用),需配置 CA 证书验证
# ssl.certificate_authorities: ["/usr/share/filebeat/certs/http_ca.crt"]
# 自定义索引名称(按天分割)
index: "sursen-admin-logs-%{+yyyy.MM.dd}"
# 连接 Kibana(让 Filebeat 自动在 Kibana 创建索引模式)
setup.kibana:
host: "http://kibana:5601" # 同一网络内,通过容器名访问 Kibana 服务
# 若 Kibana 启用认证,添加账号密码(通常与 ES 相同)
username: "elastic"
password: "你的ES密码"
单独Docker compose 安装 filebeat 连接本地已经安装好的 es 和 kibana
docker-compose.yaml
version: '3.8'
services:
# Filebeat 服务(采集日志并发送到本地 ES)
filebeat:
image: registry.cn-beijing.aliyuncs.com/yyb-ricky/filebeat:8.6.2 # 版本与 ES 一致
container_name: filebeat
restart: always
user: root # 临时用 root 权限(避免容器无法读取宿主机日志/配置)
volumes:
# 挂载 Filebeat 配置文件(宿主机 ./filebeat/filebeat.yml → 容器内默认路径)
- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
# 挂载宿主机日志文件(需与 filebeat.yml 中配置的路径一致)
- /root/v2.2_arv/ARV_Install_Package/SurSecAdmin/sursen.log:/var/log/sursen.log:ro
# 持久化 Filebeat 数据(保存日志读取进度,避免重复采集)
- ./filebeat/filebeat-data:/usr/share/filebeat/data
# 若 ES 启用了 TLS 加密,需挂载 ES 的 CA 证书(如 /etc/elasticsearch/certs/http_ca.crt)
# - /etc/elasticsearch/certs/http_ca.crt:/usr/share/filebeat/certs/http_ca.crt:ro
volumes:
filebeat-data: # 持久化 Filebeat 读取进度
注意
- filebeat版本需要和elasticsearch和kibana保持一致.或者接近.避免垮版本不兼容
- 这种方式容易出现的问题是,容器内filebeat访问不到宿主机的es和kibana,可能需要关闭防火墙
- filebeat 7.9.X 以上版本默认索引类型是数据流,如需要普通索引需要显示的将数据流禁用
output.elasticsearch:
hosts: ["http://localhost:9200"]
# 禁用数据流
data_stream:
enabled: false
# 指定普通索引名称(如按日期分割)
index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}"
- filebeat.yaml中日志的文件路径配置需要跟容器内的日志文件路径一致.而非宿主机上的日志位置
filebeat.yaml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/sursen.log # 容器内日志路径(与 docker-compose 挂载的宿主机路径对应)
# 不添加任何JSON解析、dissect等处理器,保持日志原样
fields:
service: sursen-admin # 可选:添加自定义字段,方便筛选
fields_under_root: false # 自定义字段是否平铺(默认false,嵌套在fields下)
# 输出到本地 ES
output.elasticsearch:
# 宿主机局域网 IP(与 Kibana 配置的 ES 地址一致)
hosts: ["http://192.168.8.20:9200"]
# 若 ES 启用认证,添加账号密码
username: "elastic"
password: "H*JZQ5iSpxj0yGvn*C+5"
# 若 ES 启用了 TLS(8.x 默认启用),需配置 CA 证书验证
# ssl.certificate_authorities: ["/usr/share/filebeat/certs/http_ca.crt"]
# 自定义索引名称(按天分割)
index: "sursen-admin-logs-%{+yyyy.MM.dd}"
# 关键:添加模板配置(与自定义索引匹配)
setup.template:
name: "sursen-admin-logs" # 模板名称(自定义,建议与索引前缀一致)
pattern: "sursen-admin-logs-*" # 模板匹配的索引模式(匹配上面自定义的按天分割索引)
enabled: true # 启用模板
# 连接 Kibana(让 Filebeat 自动在 Kibana 创建索引模式)
setup.kibana:
host: "http://192.168.8.20:5601" # 同一网络内,通过容器名访问 Kibana 服务
# 若 Kibana 启用认证,添加账号密码(通常与 ES 相同)
username: "elastic"
password: "H*JZQ5iSpxj0yGvn*C+5"
# 禁用 ILM(与自定义索引兼容)
setup.ilm.enabled: false
# curl -u elastic:H*JZQ5iSpxj0yGvn*C+5 http://192.168.8.20:9200