都十几年的java程序员了还不会搭建ELK+fileBeat?

内容分享2周前发布
2 0 0

我的环境是用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:

# Elasticsearch

elasticsearch:

image:
docker.elastic.co/elasticsearch/elasticsearch:7.17.21 # 使用 7.x 版本以兼容 JDK8

container_name: elasticsearch

environment:

– discovery.type=single-node

– “ES_JAVA_OPTS=-Xms512m -Xmx512m” # 限制内存使用

– xpack.security.enabled=false # 学习环境禁用安全认证

volumes:

– elasticsearch_data:/usr/share/elasticsearch/data

ports:

– “9200:9200”

networks:

– elk-network

restart: unless-stopped

# Kibana

kibana:

image: docker.elastic.co/kibana/kibana:7.17.21

container_name: kibana

environment:

– ELASTICSEARCH_HOSTS=http://elasticsearch:9200

ports:

– “5601:5601”

networks:

– elk-network

depends_on:

– elasticsearch

restart: unless-stopped

# Logstash

logstash:

image: docker.elastic.co/logstash/logstash:7.17.21

container_name: logstash

environment:

– LS_JAVA_OPTS=-Xmx256m -Xms256m

volumes:

– ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro

– ./logstash/pipeline:/usr/share/logstash/pipeline:ro

ports:

– “5044:5044”

networks:

– elk-network

depends_on:

– elasticsearch

restart: unless-stopped

# Filebeat

filebeat:

image: docker.elastic.co/beats/filebeat:7.17.21

container_name: filebeat

user: 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-network

depends_on:

– elasticsearch

– logstash

restart: unless-stopped

# 定义网络和卷

networks:

elk-network:

driver: bridge

volumes:

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”=> “(.|
)*”

}

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: log

enabled: true

paths:

– /var/log/*.log

– /var/log/auth.log

– /var/log/syslog

fields:

log_type: system

– type: log

enabled: true

paths:

– /var/lib/docker/containers/*/*.log

fields:

log_type: docker

# 设置模块路径

filebeat.config.modules:

path: ${path.config}/modules.d/*.yml

reload.enabled: false

# 输出到 Logstash

output.logstash:

hosts: [“logstash:5044”]

# 日志记录设置(可选,用于调试)

logging.level: info

logging.to_files: true

logging.files:

path: /usr/share/filebeat/logs

name: filebeat

keepfiles: 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:wslprojectelk-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 文件的目录,然后再执行启动命令。

都十几年的java程序员了还不会搭建ELK+fileBeat?

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...