0. 架构
版本号:
- ElasticSearch -7.4.2
- Kibana - 7.4.2
- logstash - 7.4.2
- filebeat - 7.4.2
如果后续日志数据海量也可以加上缓存redis或者消息队列进行升级
前言:
- 需要先自定义一个docker网络,来使elasticsearch和logstash的ip地址固定,不然的话docker重启后可能会导致ip变动出现的问题
- 自定义网络后在docker run 时指定自己想要的自定义ip,不让docker自动给你分配
1. docker创建自定义网络
章节一只是创建网络,如果要使用该网络是在docker run时指定的,后续章节会docker run是注意指定ip即可
#查看docker的网络
docker network ls
#创建一个网段在172.22.1.x 和网关为172.22.1.1的桥接类型网络名叫elk-net
docker network create --driver bridge --subnet 172.22.1.0/24 --gateway 172.22.1.1 elk-net
#查看docker网络,网络是否创建成功
docker network ls
2. docker创建ElasticSearch实例
同时指定elasticsearch容器内网ip为172.22.1.2
#先将es的数据与配置与需要映射的文件夹创建好
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
#配置es地址
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
#保证权限
chmod -R 777 /mydata/elasticsearch/
#创建并启动实例
docker run --name elasticsearch \
--network elk-net --ip 172.22.1.2 \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
#查看容器的ip是否是我们自己分配的ip,例如下查看容器名称为elasticsearch的ip(容器起来后才能看到)
docker inspect elasticsearch |grep IPAddress
测试是否搭建成功:http://127.0.0.1:9200/
3. 创建Kibana实例
同时指定elasticsearch容器内网ip为172.22.1.3
#不能使用公网ip,使用内网es分配的ip启动kibana ,以下命令查看elasticsearch内网ip为172.22.1.2
docker inspect elasticsearch |grep IPAddress
#注意配置自己的IP地址
docker run --network elk-net --ip 172.22.1.3 \
--name kibana -e ELASTICSEARCH_HOSTS=http://172.22.1.2:9200 -p 5601:5601 -d kibana:7.4.2
测试是否搭建成功:http://127.0.0.1:5601/
4. 创建logstash
mkdir -p /mydata/logstash/config
chmod -777 /mydata/logstash
创建logstash.yml
#创建logstash.yml配置文件
vim /mydata/logstash/config/logstash.yml
#文件内容如下:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.22.1.2:9200" ]
创建logstash.config
#创建logstash.config配置文件
vim /mydata/logstash/config/logstash.config
#文件内容如下:
# 从filebeat中输入
input {
beats {
port => "5044"
}
}
# 输出到es中
output {
# 推荐下面这种写法,比较简洁
elasticsearch {
hosts => [ "172.22.1.2:9200"]
# 刷新频率
#flush_size => 1000
#es中创建索引的名称(注意 index里面不能存在大写字符)
index => "%{[fields][appname]}-%{+YYYY.MM.dd}"
document_type => "log"
}
}
启动logstash
同时指定logstash容器内网ip为172.22.1.4
docker run --network elk-net --ip 172.22.1.4 \
-p 5044:5044 -p 4560:4560 -d --name logstash \
-v /mydata/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:rw \
-v /mydata/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:rw \
logstash:7.4.2
5. 创建filebeat
创建外挂目录
mkdir -p /mydata/filebeat/data
mkdir -p /mydata/filebeat/config
mkdir -p /mydata/filebeat/log
chmod 777 /mydata/filebeat/
查询logstash内网地址
#不能使用公网ip,使用内网es分配的ip启动kibana ,以下命令查看logstash内网ip为172.22.1.4
docker inspect logstash |grep IPAddress
创建filebeat.yml配置文件
touch /mydata/filebeat/config/filebeat.yml
filebeat.yml内容:
# 设置filebeat的输入为文件输入
filebeat.inputs:
# 这里可以配置多个path,采集不同应用服务的日志,然后在logstash中按照应用服务名为index保存到es中
- type: log
enabled: true
# 采集指定目录的日志(模拟采集第一个应用服务的日志)
paths:
- /mydata/filebeat/log/*.log
# 指定应用程序日志type,方便后面logstash在es中对不同的应用服务日志创建不同的索引
fields:
appname: test-admin1
# 将属性放到根下 比如 appname 属性,在其他地方访问直接 [appname] 即可访问,不开启的话需要 [fields][appname]才能访问
#fields_under_root: true
- type: log
enabled: true
# 采集指定目录的日志(模拟采集第二个应用服务的日志)
paths:
- /mydata/filebeat/log/*.log
# 指定应用程序日志type,方便后面logstash在es中对不同的应用服务日志创建不同的索引
fields:
appname: test-admin
#fields_under_root: true
# 指定索引的分区数
setup.template.settings:
index.number_of_shards: 3
#指定logstash的配置,日志采集后输出到logstash中
output.logstash:
hosts: ["172.22.1.4:5044"]
注意
/mydata/filebeat/log/*.log
是我们容器内部的日子扫描路径,如果是使用docker的话需要外挂该目录不然filebeat扫描不到日志启动filebeat:外挂日志目录和配置文件
同时指定filebeat容器内网ip为172.22.1.5
filebeat有需要的话可以多启动几个,只需要指定不同的外挂地址即可,就和架构图一致了
docker run -d \
--network elk-net --ip 172.22.1.5 \
--name=filebeat \
-v /mydata/filebeat/log/:/usr/share/filebeat/logs \
-v /mydata/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
docker.elastic.co/beats/filebeat:7.4.2
6. 导入日志进行测试
我将日志导入到我安装docker的机器上模拟日志输出
此时filebeat是会检测到的,会输出一下日志
然后我们上Kibana发现有日志导入es成功