这是崔斯特的第九十三篇原创文章
部署相关 (๑• . •๑)
Docker通过EFK(Elasticsearch + Fluentd + Kibana)查询日志
这篇文章主要是参考Docker Logging via EFK (Elasticsearch + Fluentd + Kibana) Stack with Docker Compose,并在其基础上做了一些修改。
Elasticsearch是一个开源搜索引擎,以易用性着称。kibana是一个图形界面,可以在上面条件检索存储在ElasticSearch里数据,相当于提供了ES的可视化操作管理器。截图如下:
这里基本的架构是这样的
这里主要解决的问题是日志查询,日志来源是docker。我们使用docker部署任务时,可以使用docker logs -f <容器id>
查看日志,也可以去/var/lib/docker/containers/<容器id>/<容器id>-json.log
查看日志文件。但是这都很难去做查询,本文介绍的EFK就可以解决这个问题。
我们会创建四个容器:
- httpd (发送日志给EFK)
- Fluentd
- Elasticsearch
- Kibana
环境准备
请安装最新的docker及docker-compose,老版本会有些问题。
这里是我的版本
|
|
编写docker-compose.yml
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。
|
|
所有web
里的日志会自动发送到fluentd-address: localhost:24224
,也就是fluentd
容器。
Elasticsearch 和 Kibana并不支持最新的版本,这里选择的是5.3.0,如果想要选择更新的,可以去这里查看
Fluentd的配置和插件
新建文件fluentd/Dockerfile
,使用官方镜像Fluentd’s official Docker image,安装需要的插件
|
|
然后新建文件fluentd/conf/fluent.conf
,编写Fluentd的配置文件
|
|
官方设置文档config-file
启动容器
在后台启动,使用docker-compose up -d
|
|
查看所有容器
|
|
产生日志
原文是repeat 10 curl http://localhost:80/
,但是我在docker-compose.yml中修改了端口,所以我这里是
|
|
查看日志
打开http://localhost:5601
,提示需要先建索引,输入fluentd-*
刷新即可
去Discover
页面,然后就可以看到之前的日志了。
如何接入其他docker日志
这里是以docker-compose形式启动的一个服务,如果还有别的任务需要将日志发送到fluentd
,需要这几个步骤。
默认情况下,docker-compose会为我们的应用创建一个网络,服务的每个容器都会加入该网络中。这样,容器就可被该网络中的其他容器访问,不仅如此,该容器还能以服务名称作为hostname被其他容器访问。
所以我们首先需要找到我们现在创建的EFK的网络名,
|
|
我是在temp目录下创建的docker-compose.yml文件,所以这里默认的名字就是temp_default
。
再看看之前web的设置
|
|
有几个关键设置是:links和logging,link 用于容器直接的互通,logging则是日志的输出设置。
那我们这里再启动一个新docker需要这些设置
|
|
我们去kibana看看,果然,日志已经发送到kibana了
将log添加到选择字段,日志阅读起来更佳
版本选择
上面说到这里选择的是5.3.0
,我们试试新版本6.7.1
,再看看kibana。使用docker-compose stop
停止服务,修改docker-compose文件再启动。
但是已启动es就挂了,最
后查看日志docker-compose logs | grep elasticsearch_1
,发现如下错误:
“Native controller process has stopped - no new native processes can be started”
最后在giuhub上找到答案:es crashes with “Native controller process has stopped - no new native processes can be started”
解决方法是,提高docker可用内存,mac上是这样设置,把内存从2G提高到4G,再启动就成功了。
这里是6.7.1的界面
最后想要做的就是如何在一台服务器上搜集所有的日志,理论上来说,只需要一台服务器部署上EFK,暴露端口,其他服务器去发送即可,实际上还没试过。
如果有好的意见,欢迎来提。