一、ELK 是什么?
本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢?
ELK 是三个开源框架的简写,分别是:Elasticsearch
、Logstash
、Kibana
。
| 框架 | 简介 | 作用 |
| — | ———– | —— |
| Elasticsearch
| 开源分布式搜索引擎,提供存储、分析、搜索功能。特点:分布式、基于reasful风格、支持海量高并发的准实时搜索场景、稳定、可靠、快速、使用方便等。|接收搜集的海量结构化日志数据,并提供给Kibana查询分析。|
| Logstash
| 开源日志搜集、分析、过滤框架,支持多种数据输入输出方式。| 用于收集日志,对日志进行过滤形成结构化数据,并转发到Elasticsearch中。 |
| Kibana
| 开源日志报表系统,对Elasticsearch以及Logstash有良好的web页面支持。| 对Elasticsearch提供的数据进行分析展示。 |
Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,Elastic 引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。
二、基础配置
$ sudo vim /etc/security/limits.conf
# 增加或者修改下面的字段
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
root soft nproc unlimited
$ sudo vi /etc/sysctl.conf
# 增加或修改下面的字段
vm.max_map_count=262144
上面的修改是不会自动生效的,需要使上面的配置生效。
$ sudo sysctl -p
vm.max_map_count = 262144
三、安装部署
docker环境配置思路:
- 第一次运行,COPY docker中的配置文件到本地,复制完删除这些容器。
然后在本地根据具体情况来修改这些配置文件。 - 第二次运行,把本地修改好的配置文件挂载到容器内。
注意Elasticsearch,kibana,logstash
软件版本需要一致
,要不然可能会出现读取数据失败。
1.创建docker网络
$ docker network create -d bridge elastic
2.Elasticsearch
获取默认配置文件
# -e "discovery.type=single-node" 使 Elasticsearch 以单节点模式运行
# -e ES_JAVA_OPTS="-Xms8g -Xmx8g" Elasticsearch 进程使用 8GB 的堆内存来运行
docker run -it \
-d \
-p 9200:9200 \
-p 9300:9300 \
--name es01 \
--net elastic \
-e ES_JAVA_OPTS="-Xms8g -Xmx8g" \
-e "discovery.type=single-node" \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
elasticsearch:8.3.0
在第一次运行Elasticsearch
的时候会打印登录密码和用于Kibana
的令牌,具体内容就是下面的这样,token只有30分钟有效期:
其实看没看到都不重要,这一步的主要目的是获取默认的配置文件。密码和令牌都可以重置。
创建Elasticsearch
挂载目录,把容器内的配置文件copy出来,在本地做好配置修改后再映射到容器。
mkdir /home/$USER/elk/elasticsearch
sudo chown -R 1000:1000 /home/$USER/elk/elasticsearch
docker cp es01:/usr/share/elasticsearch/config /home/$USER/elk/elasticsearch
docker cp es01:/usr/share/elasticsearch/data /home/$USER/elk/elasticsearch
docker cp es01:/usr/share/elasticsearch/plugins /home/$USER/elk/elasticsearch
docker cp es01:/usr/share/elasticsearch/logs /home/$USER/elk/elasticsearch
docker rm -f es01
修改本地配置文件
$ vi /home/$USER/elk/elasticsearch/config/elasticsearch.yml
# 增加
xpack.monitoring.collection.enabled: true
第二次运行docker
docker run -it \
-d \
-p 9200:9200 \
-p 9300:9300 \
--name es01 \
--net elastic \
-e ES_JAVA_OPTS="-Xms8g -Xmx8g" \
-e "discovery.type=single-node" \
-e LANG=C.UTF-8 \
-e LC_ALL=C.UTF-8 \
-v /home/$USER/elk/elasticsearch/config:/usr/share/elasticsearch/config \
-v /home/$USER/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/$USER/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /home/$USER/elk/elasticsearch/logs:/usr/share/elasticsearch/logs \
elasticsearch:8.3.0
这时可以在浏览器输入https://IP:9200
,输入信息登录,这样就成功了。
- 默认用户名:elastic
- 密码:不知道没关系,看下面。
重置密码或令牌
重置密码
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
重置令牌(只有30分钟,有效期)
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
3.Kibana
可以简单理解为Elasticsearch的可视化操作平台。
获取默认配置文件
docker run -it \
-d \
--restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
--name kib01 \
-p 5601:5601 \
--net elastic \
kibana:8.3.0
mkdir /home/$USER/elk/kibana
sudo chown -R 1000:1000 /home/$USER/elk/kibana
docker cp kib01:/usr/share/kibana/config /home/$USER/elk/kibana
docker cp kib01:/usr/share/kibana/data /home/$USER/elk/kibana
docker cp kib01:/usr/share/kibana/plugins /home/$USER/elk/kibana
docker cp kib01:/usr/share/kibana/logs /home/$USER/elk/kibana
docker rm -f kib01
修改本地配置文件
$ vi /home/$USER/elk/kibana/config/kibana.yml
# 增加,kibana界面,汉化作用
i18n.locale: "zh-CN"
第二次运行docker
docker run -it \
-d \
--restart=always \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
--name kib01 \
-p 5601:5601 \
--net elastic \
-v /home/$USER/elk/kibana/config:/usr/share/kibana/config \
-v /home/$USER/elk/kibana/data:/usr/share/kibana/data \
-v /home/$USER/elk/kibana/plugins:/usr/share/kibana/plugins \
-v /home/$USER/elk/kibana/logs:/usr/share/kibana/logs \
kibana:8.3.0
通过kibana登录Elasticsearch
第一次登录会有一个验证,需要输入Elasticsearch
对kibana
的token
,然后kibana会有一个验证码。具体操作看下面:
首先打开kibana运行log:
docker logs -f kib01
这时可以在浏览器输入https://IP:5601
,输入token
(不知道没关系,看上面的重置令牌):
这时可以看到kib01的运行log,先准备一下,接收验证码。
在第一次登录kibana并输入完elasticsearch
的token
之后需要一个验证码,会在上面的kibana log生成。
然后输入上面的验证码即可。(汉化后的kibana界面):
从此之后,就不怎么需要
https://IP:9200
这个端口登录Elasticsearch
了。
换成http://IP:5601
。
注意这两个地址,9200
这个必须用https
,5601
这个用http
。
修改Elasticsearch密码
原始密码以及工具重置的密码都是很给定的复杂密码,这里可以修改自定义密码:
4.Logstash
获取默认配置文件
docker run -it \
-d \
--name logstash \
-p 9600:9600 \
-p 5044:5044 \
--net elastic \
logstash:8.3.0
mkdir /home/$USER/elk/logstash
sudo chown -R 1000:1000 /home/$USER/elk/logstash
docker cp logstash:/usr/share/logstash/config /home/$USER/elk/logstash
docker cp logstash:/usr/share/logstash/pipeline /home/$USER/elk/logstash
cp -r /home/$USER/elk/elasticsearch/config/certs /home/$USER/elk/logstash/config/certs
docker rm -f logstash
修改本地配置文件
$ vi /home/$USER/elk/logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: [ "https://172.18.0.2:9200" ]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "your elastic passwd"
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/share/logstash/config/certs/http_ca.crt"
#xpack.monitoring.elasticsearch.ssl.ca_trusted_fingerprint: "af25d88b7d0c6aa9461f6a7adfcad92ff6c4821f2253b41f2c82be1398c82d73"
$ vi /home/$USER/elk/logstash/pipeline/logstash.conf
# logstash的config文件,可以认为分为三个部分:
# input log输入源,可以指定一个路径,如:
input {
file {
path => [ "/path/to/logs/dir1/*.log", "/path/to/logs/dir2/*.log" ]
start_position => "beginning"
}
}
# beats:可选,即filebeat,端口5044
input {
beats {
port => 5044
}
}
# filter log过滤器
filter {
date {
match => [ "@timestamp", "yyyy-MM-dd HH:mm:ss" ]
}
mutate {
remove_field => ["@version", "agent", "cloud", "host", "input", "log", "tags", "_index", "_source", "ecs", "event"]
}
}
# output 输出指向
output {
elasticsearch {
hosts => ["https://172.18.0.2:9200"]
index => "server-%{+YYYY.MM.dd}"
ssl => true
ssl_certificate_verification => false
cacert => "/usr/share/logstash/config/certs/http_ca.crt"
ca_trusted_fingerprint => "af25d88b7d0c6aa9461f6a7adfcad92ff6c4821f2253b41f2c82be1398c82d73"
user => "elastic"
password => "your elastic passwd"
}
}
第二次运行docker
docker run -it \
-d \
--name logstash \
-p 9600:9600 \
-p 5044:5044 \
--net elastic \
-v /home/$USER/elk/test_log:/usr/share/logstash/target \
-v /home/$USER/elk/logstash/config:/usr/share/logstash/config \
-v /home/$USER/elk/logstash/pipeline:/usr/share/logstash/pipeline \
logstash:8.3.0
测试一下
在上面配置的log 路径哪里放好log,登录Kibanna
(https://IP:5601
),查看Stack Management ->索引管理
在索引管理页面看到新增的索引,这样logstash基本配置就成功了。
有了索引之后,进入Discover:
创建后就可以看到log信息了:
具体的logstash整合、解析规则还要看具体需求。
5.filebeat(可选,当log较多时,Logstash可能会性能不足)
获取默认配置文件
docker run -it \
-d \
--name filebeat \
--network host \
-e TZ=Asia/Shanghai \
filebeat:8.3.0 \
filebeat -e -c /usr/share/filebeat/filebeat.yml
mkdir /home/$USER/elk/filebeat
sudo chown -R 1000:1000 /home/$USER/elk/filebeat
docker cp filebeat:/usr/share/filebeat/filebeat.yml /home/$USER/elk/filebeat
docker cp filebeat:/usr/share/filebeat/data /home/$USER/elk/filebeat
docker cp filebeat:/usr/share/filebeat/logs /home/$USER/elk/filebeat
docker rm -f filebeat
修改本地配置文件
$ vi /home/$USER/elk/filebeat/filebeat.yml
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
output.logstash:
enabled: true
# The Logstash hosts
hosts: ["172.18.0.4:5044"]
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/share/filebeat/target/*.log
- /usr/share/filebeat/target/elk/*.log
scan_frequency: 10s
exclude_lines: ['HEAD']
exclude_lines: ['HTTP/1.1']
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|Exception|捕获异常'
multiline.negate: false
multiline.match: after
第二次运行docker
docker run -it \
-d \
--name filebeat \
--network host \
-e TZ=Asia/Shanghai \
-v /home/$USER/elk:/usr/share/filebeat/target \
-v /home/$USER/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /home/$USER/elk/filebeat/data:/usr/share/filebeat/data \
-v /home/$USER/elk/filebeat/logs:/usr/share/filebeat/logs \
filebeat:8.3.0 \
filebeat -e -c /usr/share/filebeat/filebeat.yml
测试一下
和上面Logstash的测试方法一样。