[编者的话] Daniel Berman ( Logz.io 产品经理)为了记念 Docker 四岁生日,撰写一系列文章,介绍如何使用 ELK 收集和处理 Dockerized 环境日志。小数今天给你们带来的第一部分将介绍如何安装各个组件以及不一样日志收集方案的特色,下一部分将侧重于分析和可视化,近期发出,记得关注咱们噢~git
PS :数人云工程师们已奔赴奥斯汀 DockerCON2017 现场,更多最佳实践后天为您奉上!github
容器运行程序时产生的日志具备“无常,分布,隔离”等特色,所以在架构中收集 Docker 日志面临很大的挑战,有待尝试一种强有力的日志收集和处理方案来解决此类复杂问题。docker
ELK ( Elasticsearch , Logstash 和 Kibana )是处理容器日志的一种方式,尽管设置 ELK 工做流并不容易(难度取决于环境规格),但最终可使用 Kibana 的监控面板来展现 Docker 日志:json
.数组
为了记念 Docker 四岁生日,咱们将撰写一系列文章,介绍如何使用 ELK 收集和处理 Dockerized 环境日志。第一部分将介绍如何安装各个组件以及不一样日志收集方案的特色,并创建从容器中收集日志的工做流,下一部分将侧重于分析和可视化。bash
Dockerized 环境中的典型 ELK 日志收集流程以下所示:服务器
Logstash 负责从各类 Docker 容器和主机中提取日志,这个流程的主要优势是能够更好地用过滤器来解析日志, Logstash 将日志转发到 Elasticsearch 进行索引, Kibana 分析和可视化数据。网络
固然这个流程能够有多种不一样的实现方式, 例如可使用不一样的日志收集和转发组件, 如 Fluentd 或 Filebeat 将日志发送到 Elasticsearch ,或者,添加一个由 Kafka 或 Redis 容器组成的中间层,做为 Logstash 和 Elasticsearch 之间的缓冲区。上图显示了日志从 Docker 到 ELK 的基本流程。架构
那么,如何设置这个流程呢?app
能够将 ELK 套件安装在一个容器里,也可使用不一样的容器来分别安装各个组件。
关于在 Docker 上部署 ELK 是不是生产环境的可行性解决方案(资源消耗和网络是主要问题)仍然存在不少争议,但在开发中这是一种很是方便高效的方案。
ELK 的 docker 镜像推荐使用 docker-elk, 它支持丰富的运行参数(可以使用这些参数组合不一样的版本)和文档, 并且彻底支持最新版本的 Elasticsearch, Logstash, 和 Kibana.
在安装组件以前须要确保如下端口没有被占用:5601 (Kibana), 9200 (Elasticsearch), and 5044 (Logstash).
同时须要确保内核参数 vm_max_map_count 至少设置为 262144:
sudo sysctl -w vm.max_map_count=262144
To run the stack:
运行以下命令:
git clone https://github.com/deviantony/docker-elk.git cd docker-elk docker-compose up
正常状况下, ELK 套件的三个服务(Elasticsearch, Logstash, Kibana)会启动成功,默认持久化数据目录 /var/lib/elasticsearch (Elasticsearch 的数据存储目录)
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73aedc3939ad dockerelk_kibana "/bin/sh -c /usr/l..." 7 minutes ago Up 6 minutes 0.0.0.0:5601->5601/tcp dockerelk_kibana_1 b684045be3d6 dockerelk_logstash "logstash -f /usr/..." 7 minutes ago Up 6 minutes 0.0.0.0:5000->5000/tcp dockerelk_logstash_1 a5778b8e4e6a dockerelk_elasticsearch "/bin/bash bin/es-..." 7 minutes ago Up 7 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp dockerelk_elasticsearch_1
可经过以下的方式来确保全部组件都能正常运行。
首先尝试访问 Elasticsearch 运行以下命令:
curl localhost:9200
输出结果:
{ "name" : "W3NuLnv", "cluster_name" : "docker-cluster", "cluster_uuid" : "fauVIbHoSE2SlN_nDzxxdA", "version" : { "number" : "5.2.1", "build_hash" : "db0d481", "build_date" : "2017-02-09T22:05:32.386Z", "build_snapshot" : false, "lucene_version" : "6.4.1" }, "tagline" : "You Know, for Search" }
打开 Kibaba 页面经过 http://[serverIP]:5601:
值得注意的是须要输入索引模式才能正常进行后续处理,这个稍后将会介绍。
安装组件比较简单,相比而言将 Docker 日志发送到 ELK 有点复杂,这取决于输出日志的方式。
若是没有额外指定,容器的 stdout 和 stderr 输出(也称为“ docker logs ”)输出到 JSON 文件。因此,若是是一个小型 Docker 环境,使用 Filebeat 来收集日志将是不错的选择。但若是使用其余日志记录驱动程序,则可能须要考虑其余方法。
如下是将日志导入 ELK 的三种不一样的方法,切记,这并不能包含全部的方案。
Filebeat 属于 Elastic 的 Beats 系列日志收集组件, Filebeat 是用 Go 语言开发的,支持追踪特定文件和日志加密的中间组件,它能够配置将日志导出到 Logstash 或者直接导出到 Elasticsearch.
如上所述,若使用默认的 json 文件记录驱动程序, Filebeat 是一种相对简便的方式,能够输出日志到 ELK.Filebeat 部署在主机上,或将其做为容器与 ELK 容器一块儿运行(在这种状况下,须要添加到 ELK 容器的连接),这里有各类Filebeat Docker images可用,有些包括运行 Filebeat 并将其链接到 Logstash 的配置。
Filebeat 配置将须要指定 JSON 日志文件的路径(位于:/ var / lib / docker / containers / ...)和目标的详细信息(一般是 Logstash 容器)。
下面是一个配置的例子
prospectors: - paths: - /var/log/containers/<xxx> document_type: syslog output: logstash: enabled: true hosts: - elk:5044
Docker 从 1.12 开始支持Logging Driver,容许将 Docker 日志路由到指定的第三方日志转发层,可将日志转发到 AWS CloudWatch , Fluentd , GELF 或 NAT 服务器。
使用 logging drivers 比较简单,它们须要为每一个容器指定,而且将须要在日志的接收端进行其余配置。
在将日志发送到 ELK 的上下文中,使用 syslog 日志驱动多是最简单的方法。
下面是一个指定 Logging Driver 的例子:
docker run \ --log-driver=syslog \ --log-opt syslog-address=tcp://<SyslogServerIP>:5000 \ --log-opt syslog-facility=daemon \ alpine ash
如此这样运行每个容器,结果是将 Docker 容器日志流输出到 syslog 实例,这些日志将转发到 Logstash 容器进行解析和数据加强,进入 Elasticsearch 。
Logspout 是 Docker 流行和轻量级的( 15.2MB )日志路由器,它将附加到主机中的全部容器,并将 Docker 日志流输出到 syslog 服务器(除非定义了不一样的输出目标)。
sudo docker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+tls://<syslogServerIP>:5000
使用Logstash module直接将日志路由到 Logstash 容器,但这须要其余配置和编译工做。
本人在 In this blog post这篇文章中介绍了 Logz.io 的日志采集器,像 Logspout 同样,它附加在 Docker 主机中的全部容器上,但它不只运送 Docker 日志,还包含 Docker 统计信息和 Docker 守护程序事件。
docker run -d --restart=always -v /var/run/docker.sock:/var/run/docker.sock logzio/logzio-docker -t <YourLogz.ioToken>
目前它是为 Logz.io ELK 套件的用户设计的,咱们正在努力将它开源项目。
配置 Logstash 来解析数据相当重要,由于这部分过程将添加上下文到容器的日志中,并可以更轻松地分析数据。
在 Logstash 配置文件中须要配置三个主要部分:输入,过滤和输出。 (若运行的是 Logstash 5.x ,则该文件位于:/ usr / share / logstash / pipeline )
输入取决于日志传送方式,使用 Filebeat ,则须要指定 Beats 输入插件。若是使用 logspout 或 syslog 日志记录驱动程序,则须要将 syslog 定义为输入。
过滤器部分包含用于分解日志消息的全部过滤器插件,依赖于正在记录的容器类型以及该特定容器生成的日志消息。
这部分的配置没有捷径,由于每一个容器都输出不一样类型的日志。有不少尝试和错误涉及,可是有一些在线工具可参考, 好比:Grok Debugger。
导出部分将指定 Logstash 输出,例子中是 Elasticsearch 容器。
如下是经过 syslog 发送的 Docker 日志的基本 Logstash 配置示例。注意一系列过滤器的使用( grok , date , mutate 和 if 条件):
input { syslog { port => 5000 type => "docker" } } filter { grok { match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:service}|-) +(?:%{NOTSPACE:containerName}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" } } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } mutate { remove_field => [ "message", "priority", "ts", "severity", "facility", "facility_label", "severity_label", "syslog5424_pri", "proc", "syslog_severity_code", "syslog_facility_code", "syslog_facility", "syslog_severity", "syslog_hostname", "syslog_message", "syslog_timestamp", "ver" ] } mutate { remove_tag => [ "_grokparsefailure_sysloginput" ] } mutate { gsub => [ "service", "[0123456789-]", "" ] } if [msg] =~ "^ *{" { json { source => "msg" } if "_jsonparsefailure" in [tags] { drop {} } mutate { remove_field => [ "msg" ] } } } output { elasticsearch { hosts => "elasticsearch:9200" } }
从新启动 Logstash 容器以应用新的配置。检查 Elasticsearch 索引,确保日志流能正常工做:
curl 'localhost:9200/_cat/indices?v'
具备 Logstash 模式的索引:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open logstash-2017.03.05 kgJ0P6jmQjOLNTSmnxsZWQ 5 1 3 0 10.1kb 10.1kb yellow open .kibana 09NHQ-TnQQmRBnVE2Y93Kw 1 1 1 0 3.2kb 3.2kb
打开 Kibana 的页面
Kibana 已经建立了'logstash- *' 索引是标识,按下“建立”按钮,可在 Kibana 中看到日志。
Docker 日志记录没有完美的方案,不管选择什么解决方案,使用日志记录驱动程序, Filebeat 仍是 SaaS 监控平台,每一个方案都有优缺点。
值得一提的是, Docker 日志颇有用,但它们只表明由 Docker 主机生成的数据的一个维度,检索容器统计信息和守护程序事件等还须要额外的日志记录层。
综上所述, Logz.io 日志收集器提供了一个全面的日志解决方案,将三个数据流一块儿拉到 ELK 中。如需统计数据,建议尝试一下 Dockerbeat.
本系列的下一部分将重点介绍如何在 Kibana 中分析和可视化 Docker 日志。
Docker 生日快乐!
Daniel Berman 是 Logz.io 产品经理。擅长日志分析、大数据、云计算,热爱家庭,喜欢跑步,Liverpool FC 和写颠覆性的技术内容。