文章目录
环境
| Ip | 主机名 | cpu | 内存 |
|---|---|---|---|
| 192.168.10.100 | master01 | 4c | 8G |
| 组件 | 版本 |
|---|---|
| Ubuntu | Ubuntu 26.04 server |
| Docker | 29.1.3 |
| docker compose | v2 |
| filebeat | 7.17.18 |
| elasticsearch | 7.17.18 |
| kibana | 7.17.18 |
| logstash | 7.17.18 |
具体步骤
创建docker-compose文件夹
powershell
mkdir /compose_elkf
cd /compose_elkf
vim docker-compose.yaml
yaml
version: '3.3'
services:
elasticsearch:
container_name: elasticsearch
image: elasticsearch:7.17.18
environment:
- bootstrap.memory_lock=true
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms4g -Xmx4g"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
- 9300:9300
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
- ./elasticsearch/logs:/usr/share/elasticsearch/logs
stdin_open: true
tty: true
network_mode: bridge
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "50"
kibana:
container_name: kibana
image: kibana:7.17.18
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 5601:5601
links:
- elasticsearch:elasticsearch
depends_on:
- elasticsearch
stdin_open: true
tty: true
network_mode: bridge
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "50"
logstash:
container_name: logstash
image: logstash:7.17.18
restart: always
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- 5044:5044
links:
- elasticsearch:elasticsearch
depends_on:
- elasticsearch
stdin_open: true
tty: true
network_mode: bridge
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "50"
filebeat:
user: root
container_name: filebeat
image: docker.elastic.co/beats/filebeat:7.17.18
volumes:
- /var/log:/usr/share/filebeat/logs
- ./config/filebeat.yml:/usr/share/filebeat/filebeat.yml
command: ["--strict.perms=false"]
ulimits:
memlock:
soft: -1
hard: -1
stdin_open: true
tty: true
network_mode: host
deploy:
mode: global
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "50"
创建配置文件目录
powershell
mkdir ./config
vim ./config/filebeat.yml
编辑filebeat配置文件
注:hosts需要改成logstash所在节点的ip
yaml
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/share/filebeat/logs/syslog
- /usr/share/filebeat/logs/messages
tags: ["syslog"]
processors:
- add_host_metadata:
netinfo.enabled: true
output.logstash:
hosts: ["192.168.10.100:5044"] #这里写logstash节点的ip
powershell
vim ./config/logstash.conf
编辑logstash配置文件
yaml
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
# 从message里获取日志级别
grok {
match => {
"message" => "(?<log_level>TRACE|DEBUG|INFO|WARN|ERROR|FATAL)"
}
}
# 获取ipv4地址
mutate {
add_field => { "ipv4" => "%{[host][ip][0]}" }
}
# 删除不必要字段
mutate {
remove_field => ["agent","@version", "ecs", "log","host"]
}
# 格式化时间戳
date {
match => ["timestamp", "MMM dd HH:mm:ss", "MMM dd yyyy HH:mm:ss"]
target => "@timestamp"
}
# 添加索引日期
ruby {
code => "event.set('indexDay', event.get('@timestamp').time.localtime('+09:00').strftime('%Y%m%d'))"
}
}
output {
if "syslog" in [tags] {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "syslog-%{indexDay}"
codec => json
}
}
stdout {
codec => rubydebug
}
}
创建es数据目录
powershell
mkdir -p ./elasticsearch/data
mkdir -p ./elasticsearch/logs
给docker-compose文件夹加权
powershell
chmod 777 -R /compose_elkf
启动docker-compose
powershell
docker compose up -d
如果你的docker-compose版本是v1
powershell
docker-compose up -d

访问kibana
进来是这个页面


这里会提示创建索引模式
如果没有就稍等2,3分钟,es里还没有数据,等待logstash把数据传到es里

可以看到自动匹配了一个索引,名称按照匹配的索引来就行
*代表匹配任意多个字符
时间戳选第一个


这里就可以看到收集到的日志了
显示的格式是已经经过优化的

也可以通过这里显示固定时间段的日志

也可以通过左侧点击自己需要看到的字段
列如,我只想看ipv4,message字段


这个就是最终效果

拿到压缩包后怎么操作
如果觉得上面麻烦,或者无法科学上网。也可以直接下载我主页的compose_elkf.tar.xz资源,包括了所有文件和镜像
cscn的资源强制1g以下,只能压缩成xz格式了
powershell
tar -xJvf elkf.tar.xz
vim ./compose_elkf/config/logstash.conf
# 把hosts改成本地ip
cd compose_elkf
docker compose up -d
# 如果你的docker-compose版本是v1
docker-compose up -d
或
一些可能的疑问解答
为什么索引名是syslog+日期
索引名称是在logstash.conf里定义的

为什么docker-compose文件里filebeat的网络模式是hosts?
因为如果不是hosts获取ip的时候只会获取容器ip,只有当网络模式是hosts时获取的ip才是服务器ip
web页面里的字段是如何定义的?
是logstash.conf过滤出来的
如message日志本身是不带有ip的,当我们需要获取服务器ip时,需要配置获取并过滤
首先让filebeat抓取网络配置信息

然后通过logstash过滤出ipv4地址并赋值给ipv4这个字段

结尾
注:这套docker-compose只适合监控小群集,机器数量<50台,或者测试环境
如果是大群集,机器数量>100台,则需要elk+filebeat+kafka
其中es和kafka需要部署群集
中间件的群集只能保证应用层的高可用
需要保障硬件高可用还需要单独的运维k8s群集上部署
且密码需要密文和中间件之间通过证书连接来保证安全
后续有时间会出上面说的这一套群集