docker镜像下载
docker pull docker.elastic.co/logstash/logstash:7.5.1
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.5.1
docker pull docker.elastic.co/kibana/kibana:7.5.1
创建docker子网络
docker create network my-net
启动
docker run -p 5044:5044 --name logstash --network my-net -d docker.elastic.co/logstash/logstash:7.5.1
docker run -d -p 9100:9100 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name elasticsearch --network my-net docker.elastic.co/elasticsearch/elasticsearch:7.5.1
docker run -p 5601:5601 --name kibana --network my-net -d docker.elastic.co/kibana/kibana:7.5.1
说明:
--network my-net 指定刚才创建的子网络
-d 以daemon形式启动,这种情况不会直接在控制台输出日志
-p 将端口映射到docker容器外的宿主机
--name 给容器命名,在子网中该名称可以理解为对应的容器访问域名
修改logstash配置文件,输出到es中
docker exec -it logstash bash
cd /usr/share/logstash/pipeline/
vi logstash.conf
加入红色部分
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
}
stdout {
codec => rubydebug
}
}
重启logstash
docker restart logstash
在需要收集日志的应用服务器安装filebeat
docker pull docker.elastic.co/beats/filebeat:7.5.1
docker run --name filebeat --network my-net -v /Users/lixiaoran/Documents/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /Users/lixiaoran/Library/Caches/IntelliJIdea2019.3/tomcat/Unnamed_yzq_2/logs/:/usr/share/filebeat/outlog/ docker.elastic.co/beats/filebeat:7.5.1
说明:
-v 将宿主机目录映射到docker容器中,/usr/share/filebeat/outlog/ 日志目录整个目录映射,filebeat.yml配置文件单个文件映射
修改配置
红色部分是本地的logs目录,橙色部分是logstash接收日志的地址,此处由于在同一个自网络my-net,容器名就是子网络的域名。
filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
- /usr/share/filebeat/outlog/*
filebeat.config.modules:
# Glob pattern for configuration loading
path: ${path.config}/modules.d/*.yml
# Set to true to enable config reloading
reload.enabled: true
output.logstash:
# The Logstash hosts
hosts: ["logstash:5044"]
重启filebeat
docker restart filebeat
验证
在本地看kibana,http://localhost:5601/
成功后,刷新会出现例如:logstash-2020.01.06-000001
搜索日志
坑的总结
1.logstash 7.5.1安装过程中,配置文件目录/usr/share/logstash/pipeline/,网上很多文章写的是/usr/share/logstash/config,其实在config目录配置是无效的。
2.docker的默认全局内存上限2GB,在安装了4个容器(es,logstash,kibana,filebeat)后,es的cpu占用极高,其实是内存不足导致的,提高到5GB问题解决。下图可以看到,es占用了1.3GB的内存空间,
es一旦内存不足,就会引发重复的GC过程,导致cpu也快速升高。
3.上图可以看到filebeat的内存占用非常低,这就是为什么用filebeat在应用服务器例如tomcat,nginx等机器上安装,收集日志,再发送到远程的kafka或者logstash上。