Elasticsearch、Logstash & Kibana 和 Docker的结合

【编者的话】日志的分析和监控非常重要,对于日志来说,最常见的需求就是收集、查询、显示,这三个需求分别对应logstash、elasticsearch、kibana的功能。作者介绍了如何使用ELK Stack来构建一个实时日志查询、收集与分析系统,而在Docker之上构建这个Stack,可以事半功倍。作者贴出了自己的配置,还列举了很多注意事项,干货....

就在昨天,我刚刚在一个法国本地开发者小组 (Clermont'ech (API Hour #12))上发表了关于《我是如何使用Docker去部署应用程序》的演讲。在那里,我跟大家分享了我是怎样创建一个简单而又强大的基础架构从而实现Web应用和某些服务的“零宕机”部署的过程。

而为了监控基础设施,尤其是HTTP响应,我试着使用了一下著名的的ELK Stack。ELK 代表着ElasticsearchLogstashKibana这三个组件。在上次演讲中我并没有讲到这一部分,接下来我将在这篇文章中对它做一次详细的介绍。

The ELK Stack

我编写了一个Dockerfile来构建 ELK 的镜像。你可以直接使用镜像来实例化一个容器(挂载一个host文件夹作为卷来存放一些配置文件),当然你也可以对它作一些扩展,在里面添加一些你自己的配置数据,并且可以方便的将这样的映射重载到host文件目录中。这已经是Docker的最佳实践之一。最后要注意的一点是,Elasticsearch 的数据存储在/data目录下。我强烈建议你使用纯数据容器持久化这样的数据。

Elasticsearch、Logstash & Kibana 和 Docker的结合

 

Logstash 转发器

在我看来,这样的一个软件栈理应在它自己的独立服务器上运行,这也就是为什么logstash应该配置成只接收来自外部(例如生产环境)的日志并把日志发送到Elasticsearch。换句话说,我们需要一个工具去收集生产环境的日志,并且在其他的地方去处理它们。值得庆幸的是,这正是logstash-forwarder(原名lubmberjack)项目的设计目标。

下面是一个logstash的配置示例,其处理从lumberjack流入到5043端口的日志,并且将他们持久化到Elasticsearch。你可能注意到了,我们将Hipache的日志都通通过滤掉了(实际上,我已经把这个配置应用到了我的生产环境服务器上 :p)。

Elasticsearch、Logstash & Kibana 和 Docker的结合

值得一提的是,logstash-forwarder需要SSL的支持。

回到生产环境,我为之编写了一个Dockerfile来运行logstash-forwarder。你也需要同一组的SSL文件,像之前看到的logstash的配置,以及一个logstash-forwarder的配置文件。那么,同样地,我强烈建议使用上面提到的image作为基础镜像,而出于测试的目的,这里我们可以将host目录挂载为卷:

Elasticsearch、Logstash & Kibana 和 Docker的结合

logstash-forwarder的config.json文件包含如下所示的内容。它描述了logstash-forwarder是如何将hipache日志(位于/var/log/hipache/access.log)发送到logstash.example.org:5043的:

Elasticsearch、Logstash & Kibana 和 Docker的结合