记录第一次搭建ELK+filebeat环境
我的环境是用win11+wsl+docker desktop
前提条件
确保 WSL 中已安装 Docker 和 Docker Compose
确保你的 WSL 有足够的内存(至少 4GB 推荐给 Docker)
检查安装:
bash
docker --version docker-compose --version
第一步:创建项目目录结构
创建一个专门的项目目录来存放所有配置文件:
bash
mkdir elk-filebeat-demo cd elk-filebeat-demo mkdir -p filebeat/{data,logs}
第二步:创建 Docker Compose 文件
创建 docker-compose.yml
文件:
bash
nano docker-compose.yml
将以下内容复制到文件中:
yaml
version: '3.8'services:# Elasticsearchelasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.17.21 # 使用 7.x 版本以兼容 JDK8container_name: elasticsearchenvironment:- discovery.type=single-node- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 限制内存使用- xpack.security.enabled=false # 学习环境禁用安全认证volumes:- elasticsearch_data:/usr/share/elasticsearch/dataports:- "9200:9200"networks:- elk-networkrestart: unless-stopped# Kibanakibana:image: docker.elastic.co/kibana/kibana:7.17.21container_name: kibanaenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200ports:- "5601:5601"networks:- elk-networkdepends_on:- elasticsearchrestart: unless-stopped# Logstashlogstash:image: docker.elastic.co/logstash/logstash:7.17.21container_name: logstashenvironment:- LS_JAVA_OPTS=-Xmx256m -Xms256mvolumes:- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro- ./logstash/pipeline:/usr/share/logstash/pipeline:roports:- "5044:5044"networks:- elk-networkdepends_on:- elasticsearchrestart: unless-stopped# Filebeatfilebeat:image: docker.elastic.co/beats/filebeat:7.17.21container_name: filebeatuser: root # 需要 root 权限读取日志文件volumes:- ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro- ./filebeat/data:/usr/share/filebeat/data:rw- ./filebeat/logs:/usr/share/filebeat/logs:rw- /var/log:/var/log:ro # 挂载宿主机的日志目录- /var/lib/docker/containers:/var/lib/docker/containers:ro # 收集 Docker 容器日志networks:- elk-networkdepends_on:- elasticsearch- logstashrestart: unless-stopped# 定义网络和卷 networks:elk-network:driver: bridgevolumes:elasticsearch_data:driver: local
第三步:创建 Logstash 配置
创建配置目录和文件:
bash
mkdir -p logstash/{config,pipeline}
创建 Logstash 主配置文件:
bash
nano logstash/config/logstash.yml
内容:
yaml
http.host: "0.0.0.0" path.config: /usr/share/logstash/pipeline
创建 Logstash 管道配置文件:
bash
nano logstash/pipeline/logstash.conf
内容:
ruby
input {beats {port => 5044} }# 简单的过滤,可以按需扩展 filter {# 如果是系统日志,可以解析时间戳等if [fileset][module] == "system" {if [fileset][name] == "auth" {grok {match => { "message" => ["%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} %{DATA:[system][auth][ssh][method]} for (invalid user )?%{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]} port %{NUMBER:[system][auth][ssh][port]} ssh2(: %{GREEDYDATA:[system][auth][ssh][signature]})?","%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: %{DATA:[system][auth][ssh][event]} user %{DATA:[system][auth][user]} from %{IPORHOST:[system][auth][ssh][ip]}","%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sshd(?:\[%{POSINT:[system][auth][pid]}\])?: Did not receive identification string from %{IPORHOST:[system][auth][ssh][ip]}","%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} sudo(?:\[%{POSINT:[system][auth][pid]}\])?: \s*%{DATA:[system][auth][user]} :( %{DATA:[system][auth][sudo][error]} ;)? TTY=%{DATA:[system][auth][sudo][tty]} ; PWD=%{DATA:[system][auth][sudo][pwd]} ; USER=%{DATA:[system][auth][sudo][user]} ; COMMAND=%{GREEDYDATA:[system][auth][sudo][command]}","%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} groupadd(?:\[%{POSINT:[system][auth][pid]}\])?: new group: name=%{DATA:system.auth.groupadd.name}, GID=%{NUMBER:system.auth.groupadd.gid}","%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} useradd(?:\[%{POSINT:[system][auth][pid]}\])?: new user: name=%{DATA:[system][auth][user][add][name]}, UID=%{NUMBER:[system][auth][user][add][uid]}, GID=%{NUMBER:[system][auth][user][add][gid]}, home=%{DATA:[system][auth][user][add][home]}, shell=%{DATA:[system][auth][user][add][shell]}$","%{SYSLOGTIMESTAMP:[system][auth][timestamp]} %{SYSLOGHOST:[system][auth][hostname]} %{DATA:[system][auth][program]}(?:\[%{POSINT:[system][auth][pid]}\])?: %{GREEDYMULTILINE:[system][auth][message]}"] }pattern_definitions => {"GREEDYMULTILINE"=> "(.|\n)*"}remove_field => "message"}date {match => [ "[system][auth][timestamp]", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]}}} }output {elasticsearch {hosts => ["elasticsearch:9200"]index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"}# stdout { codec => rubydebug } # 取消注释可以在控制台看到日志,用于调试 }
第四步:创建 Filebeat 配置
创建 Filebeat 配置文件:
bash
nano filebeat/filebeat.yml
内容:
yaml
filebeat.inputs:- type: logenabled: truepaths:- /var/log/*.log- /var/log/auth.log- /var/log/syslogfields:log_type: system- type: logenabled: truepaths:- /var/lib/docker/containers/*/*.logfields:log_type: docker# 设置模块路径 filebeat.config.modules:path: ${path.config}/modules.d/*.ymlreload.enabled: false# 输出到 Logstash output.logstash:hosts: ["logstash:5044"]# 日志记录设置(可选,用于调试) logging.level: info logging.to_files: true logging.files:path: /usr/share/filebeat/logsname: filebeatkeepfiles: 7
第五步:启动 ELK 栈
现在一切就绪,启动所有服务:
bash
docker-compose up -d
检查服务状态:
bash
docker-compose ps
查看日志(如果需要调试):
bash
docker-compose logs -f elasticsearch # 或者查看特定服务日志 docker-compose logs -f filebeat
第六步:验证和访问
检查 Elasticsearch:
bash
curl http://localhost:9200
访问 Kibana:
在 Windows 浏览器中打开:http://localhost:5601
在 Kibana 中创建索引模式:
进入 Kibana → Management → Stack Management → Index Patterns
点击 "Create index pattern"
输入
filebeat-*
选择
@timestamp
作为时间字段点击 "Create index pattern"
查看日志:
进入 Kibana → Analytics → Discover
选择
filebeat-*
索引模式你应该能看到收集到的系统日志
常用命令
bash
# 停止所有服务 docker-compose down# 停止并删除数据卷(彻底清理) docker-compose down -v# 查看服务状态 docker-compose ps# 查看实时日志 docker-compose logs -f# 重启特定服务 docker-compose restart filebeat
优势说明
使用 Docker Compose 方式的好处:
隔离性:所有组件在容器中运行,不影响宿主机
一致性:版本匹配,避免兼容性问题
可重复性:配置文件化,容易重现和分享
易清理:一条命令即可完全清理环境
现在你就可以开始探索 ELK 栈的功能了!你可以修改 Filebeat 配置来收集其他日志文件,或者学习 Logstash 的过滤规则来解析特定格式的日志。
执行docker-compose up -d要先进入wsl的磁盘目录
必须要在 Docker Compose 文件所在的目录下执行命令,否则 Docker Compose 找不到 docker-compose.yml
文件。
正确的步骤应该是:
在 WSL 中切换到你的项目目录(根据你的实际路径):
bash
# 如果你的项目在 Windows 的 F:\wsl\project\elk-filebeat-demo # 在 WSL 中对应的路径可能是: cd /mnt/f/wsl/project/elk-filebeat-demo# 或者如果你的项目在 WSL 的家目录中 cd ~/elk-filebeat-demo
确认当前目录下有 docker-compose.yml 文件:
bash
ls -la
你应该能看到:
text
docker-compose.yml filebeat/ logstash/
然后才启动服务:
bash
docker-compose up -d
关于 WSL 文件路径的重要说明
在 WSL 中有两种文件存储位置:
方案一:放在 Windows 文件系统中(/mnt/...)
路径:
/mnt/f/wsl/project/elk-filebeat-demo
优点:文件在 Windows 中可见,方便用 VS Code 等工具编辑
缺点:I/O 性能稍差(但对于学习环境影响不大)
方案二:放在 WSL 原生文件系统中(~/ 或 /home/username/...)
路径:
~/elk-filebeat-demo
或/home/你的用户名/elk-filebeat-demo
优点:I/O 性能更好
缺点:在 Windows 文件资源管理器中不可直接访问
检查你是否在正确目录的方法
bash
# 查看当前目录 pwd# 查看目录内容 ls -la# 确认有 docker-compose.yml 文件 ls docker-compose.yml
如果显示 No such file or directory
,说明你不在正确的目录。
完整的正确流程示例:
bash
# 1. 进入项目目录(根据你的实际路径选择) cd /mnt/f/wsl/project/elk-filebeat-demo# 2. 确认文件存在 ls -la# 3. 启动服务 docker-compose up -d# 4. 检查服务状态 docker-compose ps# 5. 查看日志 docker-compose logs -f elasticsearch
如果已经在错误的位置启动了怎么办?
如果在错误目录执行了 docker-compose up -d
,需要先停止:
bash
# 在原来的错误目录下停止服务 docker-compose down# 然后切换到正确目录再启动 cd /正确的/路径/elk-filebeat-demo docker-compose up -d
总结:必须先进入包含 docker-compose.yml 文件的目录,然后再执行启动命令。