本文是记录一下EFK日志平台的搭建过程
项目背景:
此次搭建的日志分析平台主要是采集服务器上的java服务的log日志(输出的日志已经是json格式),这些日志都已经按照不同环境输出到/home/dev /home/test1 /home/test2 目录下了,按照不同的应用服务输出到不同的目录,比如dev环境的 common 服务,会输出到/dev/logs/common/common.log
EFK服务的部署都使用docker,然后将数据目录挂载至容器中
基础架构模型:

1.部署es
- #创建es的docker网络
- docker network create elasticsearch
- #拉取es镜像,版本号为8.12.2
- docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2
- #调整系统参数,否则es无法启动
- echo 'vm.max_map_count=262144' >>/etc/sysctl.conf
- sysctl -p
- #创建elasticsearch用户
- useradd -m elasticsearch
- passwd elasticsearch
-
- #创建es数据和目录文件夹(放在数据盘)
- mkdir -p /mnt/storage/es/data
- mkdir -p /mnt/storage/es/logs
- mkdir -p /mnt/storage/es/plugins
- #授权目录
- chown -R elasticsearch:elasticsearch /mnt/storage/es/
- chmod -R u+rwxs es/
- chmod -R 777 /mnt/storage
- #运行es,挂载配置文件目录、数据文件目录、日志目录
- #前台查看输出,先执行这个,查看并记录es的信息
- docker run --name es -e "ES_JAVA_OPTS=-Xms3072m -Xmx3072m" -v /mnt/storage/es/data:/usr/share/elasticsearch/data -v /mnt/storage/es/logs:/usr/share/elasticsearch/logs -v /mnt/storage/es/plugins:/usr/share/elasticsearch/plugins -v /etc/localtime:/etc/localtime:ro --net elasticsearch -p 9200:9200 -m 4GB -it docker.elastic.co/elasticsearch/elasticsearch:8.12.2
-
-
- #进入es容器bash
- docker start es
- docker exec -it es /bin/bash
- #压缩配置文件目录
- cd /usr/share/elasticsearch
- zip -r config.zip config/
- #退出容器bash
- exit
- #将配置文件压缩包config.zip放到/home/elasticsearch 目录
- docker cp es:/usr/share/elasticsearch/config.zip /home/elasticsearch/
- chmod 777 /home/elasticsearch/config.zip
- #解压配置文件压缩包
- su elasticsearch
- cd /home/elasticsearch
- unzip config.zip
- chmod -R 777 config/
-
- #停止并删除容器
- su root
- docker stop es
- docker rm es
-
- #后台运行
- docker run --name es -e "ES_JAVA_OPTS=-Xms3072m -Xmx3072m" -v /home/elasticsearch/config:/usr/share/elasticsearch/config -v /mnt/storage/es/data:/usr/share/elasticsearch/data -v /mnt/storage/es/logs:/usr/share/elasticsearch/logs -v /mnt/storage/es/plugins:/usr/share/elasticsearch/plugins -v /etc/localtime:/etc/localtime:ro --net elasticsearch -p 9200:9200 -m 4GB -d docker.elastic.co/elasticsearch/elasticsearch:8.12.2
-
- cd /home/elasticsearch/config/certs
- curl --cacert http_ca.crt -u elastic:${password} https://localhost:9200
-
- #后续启动
- docker start es
2.部署kibana
- #创建kibana用户
- useradd -m kibana
- passwd kibana
-
- #拉取镜像
- docker pull docker.elastic.co/kibana/kibana:8.12.2
- #运行
- docker run --name kibana --net elasticsearch -p 5601:5601 docker.elastic.co/kibana/kibana:8.12.2
-
- #ctrl+c停止容器
- #启动kibana容器
- docker start kibana
- #将配置文件/home/kibana 目录
- docker cp kibana:/usr/share/kibana/config /home/kibana/
- cd /home/kibana
- chmod -R 777 config/
-
- #创建对应的数据、日志文件夹
- su kibana
- mkdir /home/kibana/data
- mkdir /home/kibana/logs
- chmod 777 /home/kibana/data
- chmod 777 /home/kibana/logs
-
- #停止之前的容器
- su root
- docker stop kibana
- docker rm kibana
- #设置中文
- vi /home/kibana/config/kibana.yml
- #在最后添加 i18n.locale: "zh-CN"
-
- docker run --name kibana -v /home/kibana/config:/usr/share/kibana/config -v /home/kibana/data:/usr/share/kibana/data -v /home/kibana/logs:/usr/share/kibana/logs -v /etc/localtime:/etc/localtime:ro --net elasticsearch -p 5601:5601 -d docker.elastic.co/kibana/kibana:8.12.2
- #查看启动日志,另外在浏览器查看效果
- docker logs kibana
- #查看是否正常运行
- curl http://127.0.0.1:5601
-
- #通过浏览器进入kibana页面后,会需要输入es的 enrollment token,如果过期了,执行如下命令获取
- docker exec -it es /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
3.在应用服务器部署filebeat
- #创建filebeat用户
- useradd -m filebeat
- passwd filebeat
- #拉取镜像
- docker pull docker.elastic.co/beats/filebeat:8.12.2
- #将filebeat.yml放到/home/filebeat 目录下
- chmod 777 /home/filebeat/filebeat.yml
- chmod go-w /home/filebeat/filebeat.yml
- #运行,需要将日志目录挂载到容器
- docker run -u root --name filebeat -v /home/filebeat/data:/usr/share/filebeat/data:rw -v /home/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro -v /home/filebeat/logs:/usr/share/filebeat/logs -v /home/dev/logs:/usr/share/filebeat/devlogs:ro -v /home/test1/logs:/usr/share/filebeat/test1logs:ro -v /home/test2/logs:/usr/share/filebeat/test2logs:ro -v /etc/localtime:/etc/localtime:ro --privileged -m 1GB -d docker.elastic.co/beats/filebeat:8.12.2
-
4.filebeat配置(按照不同的环境将日志分发到不同的es index)
- filebeat.inputs:
- #dev环境日志采集
- - type: log
- enabled: true
- paths:
- - /usr/share/filebeat/devlogs/base-gateway/base-gateway*.log
- fields:
- log_env: "applog_dev"
- fields_under_root: true
- json:
- keys_under_root: true
- overwrite_keys: true
- message_key: "message"
- add_error_key: true
- #test1环境日志采集
- - type: log
- enabled: true
- paths:
- - /usr/share/filebeat/test1logs/base-gateway/base-gateway*.log
- fields:
- log_env: "applog_test1"
- fields_under_root: true
- json:
- keys_under_root: true
- overwrite_keys: true
- message_key: "message"
- add_error_key: true
-
- #test2环境日志采集
- - type: log
- enabled: true
- paths:
- - /usr/share/filebeat/test2logs/base-gateway/base-gateway*.log
- fields:
- log_env: "applog_test2"
- fields_under_root: true
- json:
- keys_under_root: true
- overwrite_keys: true
- message_key: "message"
- add_error_key: true
-
- filebeat.config:
- modules:
- path: ${path.config}/modules.d/*.yml
- reload.enabled: false
-
- processors:
- - add_cloud_metadata: ~
- - add_docker_metadata: ~
- - timestamp:
- # 通过日志中的timestamp字段格式化时间值 给 时间戳
- field: timestamp
- # 使用我国东八区时间 解析log时间
- timezone: Asia/Shanghai
- layouts:
- - '2006-01-02 15:04:05'
- - '2006-01-02 15:04:05.999'
- test:
- - '2019-06-22 16:33:51.765'
-
- queue.mem:
- #每1秒钟就进行推送
- flush.timeout: 1s
-
- output.elasticsearch:
- hosts: ["https://${es host}:${es port}"]
- #忽略证书校验
- ssl.verification_mode: none
- username: '${账号}'
- password: '${密码}'
- indices:
- - index: "logs-dev-%{+yyyy.MM}"
- when.contains:
- log_env: "applog_dev"
- - index: "logs-test1-%{+yyyy.MM}"
- when.contains:
- log_env: "applog_test1"
- - index: "logs-test2-%{+yyyy.MM}"
- when.contains:
- log_env: "applog_test2"
参考:
ES官方文档 What is Elasticsearch? | Elasticsearch Guide [8.12] | Elastic
Kibana官方文档 Kibana—your window into Elastic | Kibana Guide [8.12] | Elastic
Filebeat官方文档 Filebeat overview | Filebeat Reference [8.12] | Elastic