如何在Ubuntu 16.04上使用Fluentd和ElasticSearch集中您的Docker日志

当您将Docker容器转为生产环境时,您会发现越来越需要将日志保留在比容器更短暂的位置。 Docker自带了Fluentd的本地日志驱动程序,可以轻松收集...

来自第Fluentd

介绍

当您将Docker容器转为生产环境时,您会发现越来越需要将日志保留在比容器更短暂的位置。Docker窗附带了Fluentd本地日志记录的驱动程序,因此很容易收集这些日志和途径在别的地方,像Elasticsearch ,这样你就可以分析数据。 Fluentd是一个开源的数据采集器设计为统一的日志基础设施。它通过使操作工程师,应用程序工程师和数据工程师简单和可扩展地收集和存储日志,使它们结合在一起。 Fluentd有四个主要功能,使其适合于构建清洁,可靠的测井管道:
  • 使用JSON统一日志记录:Fluentd试图构建数据作为JSON尽可能。这允许Fluentd统一处理日志数据的所有方面:在多个源和目标中收集,过滤,缓冲和输出日志。使用JSON,下游数据处理更容易,因为它具有足够的结构,无需强制使用刚性模式即可访问。
  • 可插拔架构:Fluentd有一个灵活的插件系统,让社区来扩展其功能。超过300个社区提供的插件将数十个数据源连接到数十个数据输出,根据需要处理数据。通过使用插件,您可以更好地使用您的日志马上。
  • 最少的资源要求:一个数据收集要轻巧,使其舒适地运行一个繁忙的机器上。 Fluentd是以C和Ruby的组合编写的,并且需要最少的系统资源。香草实例运行在30-40MB内存,可以处理13,000个事件/秒/核心。
  • 内置的可靠性:数据丢失情况不应该发生。 Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。 Fluentd还支持强大的故障转移,并且可以设置为高可用性。
在本教程中,您将学习如何安装Fluentd并将其配置为从Docker容器收集日志。然后,将数据流式传输到在同一Ubuntu 16.04服务器上运行Elasticsearch的另一个容器,并查询日志。

先决条件

要完成本教程,您需要以下内容:

第1步 - 安装Fluentd

安装的最常见的方式Fluentd经由td-agent包。 Treasure数据 ,Fluentd的原作者,包Fluentd有一个独立的Ruby运行,所以你并不需要建立一个Ruby环境中运行Fluentd。 他们还提供了一个脚本,以获取最新的td-agent用于配置存储库和安装包您包。 以非root用户身份登录到您的服务器:
ssh sammy@your_server_ip
然后安装td-agent使用由宝数据提供的脚本。首先,下载脚本:
\curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh -o install-td-agent.sh
如果要审核脚本,请使用文本编辑器打开它:
nano install-td-agent.sh
一旦你适应了剧本的内容,运行脚本安装td-agent
sh install-td-agent.sh 
安装完成后,启动td-agent
sudo systemctl start td-agent
检查日志以确保已成功安装:
tail /var/log/td-agent/td-agent.log
您将看到类似于以下内容的输出:
    port 8888
  </source>
  <source>
    @type debug_agent
    bind 127.0.0.1
    port 24230
  </source>
</ROOT>
2016-12-02 19:45:31 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2016-12-02 19:45:31 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
接下来,使用安装Elasticsearch插件Fluentd td-agent-gem命令:
sudo td-agent-gem install fluent-plugin-elasticsearch
注:另外,Fluentd可以作为一个RubyGem,可与安装gem install fluentd 。 如果您已配置了一个Ruby的环境,你可以安装Fluentd,并使用该插件Elasticsearch gem命令:
gem install fluentd --no-rdoc --no-ri
gem install fluentd-plugin-elasticsearch --no-rdoc --no-ri
Fluentd现在已启动并使用默认配置运行。接下来,我们将配置Fluentd,以便我们可以监听Docker事件并将其传递给Elasticsearch实例。

第2步 - 配置Fluentd

Fluentd需要知道从哪里收集信息,以及在何处交付信息。您位于Fluentd配置文件中定义这些规则/etc/td-agent/td-agent.conf 。 在文本编辑器中打开此文件:
sudo nano /etc/td-agent/td-agent.conf 
删除文件的内容。在本教程中,您将从头开始编写自己的规则。 定义中的信息源source部。将此配置添加到文件:
/etc/td-agent/td-agent.conf
<source>
  @type forward
  port  24224
</source>
这定义了源作为forward ,这是在TCP上运行及将由Docker发送日志Fluentd时要使用的Fluentd协议。 当日志记录进来,,他们将有一些额外的相关领域,包括timetagmessagecontainer_id ,和其他几个人。 您可以使用的信息_tag_场来决定Fluentd应该发送的数据。 这就是所谓的数据路由 。 要配置此,定义一个match的内容匹配部分tag领域,并适当进行路由。将此配置添加到文件:
/etc/td-agent/td-agent.conf
<match docker.**>
  @type elasticsearch
  logstash_format true
  host 127.0.0.1
  port 9200
  flush_interval 5s
</match>
这条规则说,与标记每个记录前缀docker. 将被发送到Elasticsearch,这是在运行127.0.0.1端口9200 。 该flush_interval告诉Fluentd多久就应该记录Elasticsearch。 有关缓冲和冲洗的更多详细信息,请参阅缓冲区插件概述文档部分。 一旦保存新的配置文件,重新启动td-agent使应用更改服务:
sudo systemctl restart td-agent
现在Fluentd为我们的目的正确配置,让我们安装Elasticsearch从Fluentd捕获我们的日志。

第3步 - 启动Elasticsearch容器

我们将使用Docker来运行我们的Elasticsearch实例,因为它比我们自己配置的速度快。我们将使用ElasticsearchDocker窗图像来创建我们的容器。 为了使用这个形象,增加值max_map_count您的Docker主机上,如下所示:
sudo sysctl -w vm.max_map_count=262144
然后执行此命令下载Elasticsearch映像并启动容器:
docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
映像将下载,Elasticsearch容器将启动。通过检查Docker进程并查找容器,确保容器正常运行:
docker ps
你应该看到这样的输出:
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                            NAMES
76e96943491f        elasticsearch       "/docker-entrypoint.s"   About a minute ago   Up 51 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   gigantic_hawking
如果未列出的容器中,再次启动它没有-d因此容器在前台运行开关。 运行命令docker run -p 9200:9200 -p 9300:9300 elasticsearch并查看任何特定的错误消息。 你会碰到的最可能的错误与问题没有足够的系统内存,或者说, max_map_count您Docker主机值太低。检查本教程中的所有步骤,以确保您没有错过任何内容,然后重试。 现在Elasticsearch正在容器中运行,让我们生成一些日志并将它们摄入Fluentd。

第4步 - 从Docker容器生成日志

随着Docker窗,你可以把日志通过标准输出(数据流STDOUT )和错误( STDERR )接口。当您启动Docker应用程序时,只是指示Docker使用本机Fluentd日志驱动程序刷新日志。然后Fluentd服务将接收日志并将其发送到Elasticsearch。 通过在Docker容器中启动一个Bash命令来测试这个:
docker run --log-driver=fluentd ubuntu /bin/echo 'Hello world'
这将打印信息Hello world到标准输出,但它也将Docker窗Fluentd司机抓住并交付给先前配置的Fluentd服务。 大约五秒钟后,记录将刷新到Elasticsearch。 您可以在配置此区间match您的Fluentd配置文件的部分。 这足以到Elasticsearch得到日志,但你可能想看看的官方文档关于你可以用Docker窗使用管理Fluentd驱动程序选项的详细信息。 最后,让我们确认Elasticsearch正在接收事件。使用curl将查询发送到Elasticsearch:
curl -XGET 'http://localhost:9200/_all/_search?q=*'
输出将包含如下所示的事件:
{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"logstash-2016.12.02","_type":"fluentd","_id":"AVQwUi-UHBhoWtOFQKVx","_score":1.0,"_source":{"container_id":"d16af3ad3f0d361a1764e9a63c6de92d8d083dcc502cd904155e217f0297e525","container_name":"/nostalgic_torvalds","source":"stdout","log":"Hello world","@timestamp":"2016-12-02T14:59:26-06:00"}}]}}
根据您的设置,可能记录了很多事件。单个事件应该启动{"took":和时间戳结束。它还将包含与源容器关联的一些额外信息。如此输出所示,Elasticsearch正在从我们的Docker容器接收数据。

结论

从Docker容器收集日志只是使用Fluentd的一种方法。许多用户来到Fluentd构建一个日志管道,既可以进行实时日志搜索,也可以长期存储。此架构利用Fluentd复制数据流并将其输出到多个存储系统的能力。例如,您可以使用Elasticsearch进行实时搜索,但使用MongoDB或Hadoop进行批处理分析和长期存储。 Web应用程序产生大量日志,并且它们通常被格式化并存储在本地文件系统上。这可能存在问题有两个原因。首先,日志难以以编程方式解析,需要大量正则表达式,因此对于那些希望通过统计分析,A / B测试的查看结果或执行Cheat检测来理解用户行为的人不是非常易于访问。 第二,日志不能实时访问,因为文本日志被批量加载到存储系统中。更糟糕的是,如果服务器的磁盘在批量加载之间损坏,日志将丢失或损坏。 Fluentd通过为具有一致API的各种编程语言提供记录器库,解决了这两个问题。每个记录器都会向Fluentd发送包含时间戳,标签和JSON格式的事件的记录,就像您在本教程中看到的一样。有记录库为Ruby,Node.js的,Go,Python和Perl中,PHP,Java和C ++。这让应用程序“发烧和忘记”;日志记录器将数据异步发送到Fluentd,这会在将日志传送到后端系统之前缓冲日志。 有很多其他有用的东西,你可以做Fluentd和Elasticsearch。您可能会发现以下链接有趣: