docker搭建ELK日志分析系统


一、ELK 是什么?

本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢?
ELK 是三个开源框架的简写,分别是:ElasticsearchLogstashKibana

| 框架 | 简介 | 作用 |
| — | ———– | —— |
| 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

第一次登录会有一个验证,需要输入Elasticsearchkibanatoken,然后kibana会有一个验证码。具体操作看下面:
首先打开kibana运行log:

docker logs -f kib01

这时可以在浏览器输入https://IP:5601,输入token(不知道没关系,看上面的重置令牌):
这时可以看到kib01的运行log,先准备一下,接收验证码。
在第一次登录kibana并输入完elasticsearchtoken之后需要一个验证码,会在上面的kibana log生成。
然后输入上面的验证码即可。(汉化后的kibana界面):

从此之后,就不怎么需要https://IP:9200这个端口登录Elasticsearch了。
换成http://IP:5601
注意这两个地址,9200这个必须用https5601这个用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,登录Kibannahttps://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的测试方法一样。


文章作者: Wyx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Wyx !
  目录