公司需要搭建一套满足多服务查询的日志系统,正好尝试下ELK的搭建,本文主要讲的是docker环境下的ELK部署以及基础测试。真实环境中可能还会有Redis,kafka进行数据处理的缓冲。
更新
有关下面安装过程中的容器网络互通问题,单纯查询docker inspect 的ip是不行的,因为容器的ip在每次启动后都会发生改变,解决方法移步这边
一、安装ELK
前提:docker-ce环境
安装elasticsearch
版本问题可以去dockerhub中找比较新的版本,这里我采用的是7.17.22版本
- 拉取ElasticSearch
[root@VM-4-4-opencloudos config]# docker pull elasticsearch:7.17.22
拉取速度太慢以及连接超时问题, 进入/etc/docker 目录下,检查是否有daemon.json,没有的话加入一下配置后重启docker
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com" //这是腾讯云的国内加速地址,貌似只有腾讯云能用,也可以用其他的国内镜像
]
}
2.挂载elasticsearch配置
mkdir -p /data/elasticsearch/{plugins,data,logs,config}
docker cp elasticsearch:/usr/share/elasticsearch/config /data/elasticsearch
docker cp elasticsearch:/usr/share/elasticsearch/logs /data/elasticsearch
docker cp elasticsearch:/usr/share/elasticsearch/data /data/elasticsearch
docker cp elasticsearch:/usr/share/elasticsearch/plugins /data/elasticsearch
3.修改config/elasticsearch.yml配置
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.allow-origin: "*"
http.cors.enabled: true
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
4.启动elasticsearch
docker run -d --name elasticsearch \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-v /data/elasticsearch/logs:/usr/share/elasticsearch/logs \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.17.22
安装kibana可视化
老样子
docker pull kibana:7.17.22
docker run -d --name kibana -p 5601:5601 kibana:7.17.22
mkdir -p /data/kibana
docker cp kibana:/usr/share/kibana/config /data/kibana/
修改kibana配置文件,
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://172.17.0.2:9200" ] #更改为容器内的es ip
monitoring.ui.container.elasticsearch.enabled: true
重新启动
docker rm <contrainer-id>
docker run -d --name kibana -p 5601:5601 -v /data/kibana/config:/usr/share/kibana/config kibana:7.17.22
这时候我们访问ip:5601就可以访问到页面了
安装Logstash
docker pull logstash:7.17.22
docker run -d --name logstash -p 4560:4560 logstash:7.17.22
mkdir -r /data/logstash
docker cp logstash:/usr/share/logstash/config /data/logstash/
docker cp logstash:/usr/share/logstash/pipeline /data/logstash/
修改pipeline 下的配置文件
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => "ESIP:9200" #更改为自己的IP
index => "logstash-%{+YYYY.MM.dd}" # 创建的ES的索引,可以配合spring.application.name或其他参数进行更改
}
stdout {
codec => rubydebug
}
}
再更改config下的logstash.yml,配置好ES的ip 启动
docker run -d --name logstash \
-p 4560:4560
-v /data/logstash/config:/usr/share/logstash/config \
-v /data/logstash/pipeline:/usr/share/logstash/pipeline logstash:7.17.22
安装filebeat
docker pull elastic/filebeat:7.17.22
docker run -d --name filebeat elastic/filebeat:7.17.22
docker cp filebeat:/usr/share/filebeat /data/
chmod 777 /data/filebeat/data/meta.json //文件权限放开,不然启动报错
修改filebeat下的配置文件filebeat.yml
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
#output.elasticsearch:
#hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
#username: '${ELASTICSEARCH_USERNAME:}'
#password: '${ELASTICSEARCH_PASSWORD:}'
filebeat.inputs: //控制filebeat读取的日志路径
- type: log
enabled: true
paths:
- /data/logs/**.log
output.logstash:
hosts: ["logstashIp:5044"] //这里跟之前的pipeline下的logstash.yml中的beats port一致,作为输入源
docker rm <container_id>
docker run -d --name filebeat \
--user=root \
-v /data/filebeat:/user/share/filebeat \
-v /data/logs:/data/logs \
elastic/filebeat:7.17.22
这里有个注意的,需要把服务器部署的项目的日志打印位置挂载到容器中,这样才能日志才能扫描到
容器启动后我们可以docker logs -f 容器名 来动态观察容器日志
这样就说明扫描到了输入源,会从指定目录中读取log日志
kibana界面中也可以看到已经有了这个索引,我们之后只要创建索引就可以了。
Springboot方面
注意这里输出日志要和filebeat中的位置相同
后续准备再学习分享下日志的过滤、多服务的聚合以及增加kafka围绕项目为主的全局链路追踪的配置