当您将Docker容器转移到生产环境中时,您会发现经常需要将日志保留在容器外的地方。Docker提供了一个本机日志驱动程序,可以很容易地收集这些日志并将它们发送到其他地方,例如Elasticsearch和Fluentd。Elasticsearch是是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。这样您就可以分析数据了。Fluentd是一个开源数据收集器,旨在统一您的日志记录基础架构。它将操作工程师,应用工程师和数据工程师结合在一起,使其简单且可扩展,以收集和存储日志。
Fluentd有四个关键功能,使其适合构建简洁、可靠的日志通道:
在本教程中,您将学习如何安装Fluentd并将其配置为从Docker容器中收集日志。然后,您将数据流式传输到同一Ubuntu 16.04服务器上,运行Elasticsearch的另一个容器,并查询日志。
要完成本教程,您需要以下内容:
sudo
命令的非root账号的4GB Ubuntu 16.04服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。安装Fluentd最常见的方法是通过td-agent包。Treasure Data是Fluentd的原作者,它将Fluentd打包为一个独立的Ruby运行,因此您无需设置Ruby环境来运行Fluentd。它们还提供了一个脚本来获取td-agent配置存储库并为您安装软件包的最新软件包。
以非root用户身份登录服务器:
ssh sammy@your_server_ip
然后使用Treasure Data提供的脚本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
一旦您觉得脚本内容OK,请运行脚本进行安装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"
接下来,使用以下td-agent-gem
命令为Fluentd安装Elasticsearch插件:
sudo td-agent-gem install fluent-plugin-elasticsearch
现在,Fluentd已启动并使用默认配置运行。接下来,我们将配置Fluentd,以便我们可以侦听Docker事件并将它们传递给Elasticsearch实例。
Fluentd需要知道从何处收集信息以及在何处提供信息。您可以在位于/etc/td-agent/td-agent.conf
的Fluentd配置文件中定义这些规则。
在文本编辑器中打开此文件:
sudo nano /etc/td-agent/td-agent.conf
删除文件的内容。您将在本教程中从头开始编写自己的规则。您可以在source部分中定义信息源。将此配置添加到文件中:
<source>
@type forward
port 24224
</source>
这将源定义为forward,即在TCP之上运行的Fluentd协议,Docker在将日志发送到Fluentd时将使用该协议。
当日志记录输入时,他们将有一些额外的相关领域,包括time,tag,message,container_id。您可以使用tag字段中的信息来确定Fluentd应该将数据发送到何处。这称为数据路由。要配置它,请定义match与tag字段内容匹配的部分并对其进行适当的路由。将此配置添加到文件中:
<match docker.**>
@type elasticsearch
logstash_format true
host 127.0.0.1
port 9200
flush_interval 5s
</match>
此规则表示每个带有前缀标记的docker.
记录都将发送到在9200
端口上运行127.0.0.1
的Elasticsearch 。flush_interval
会告诉Fluentd应该多久记录Elasticsearch。有关缓冲和刷新的更多详细信息,请参阅缓冲区插件概述文档部分。
保存新配置文件后,重新启动td-agent服务以应用更改:
sudo systemctl restart td-agent
正确配置了Fluentd,让我们安装Elasticsearch来从Fluentd捕获我们的日志。
我们将使用Docker来运行我们的Elasticsearch实例,我们将使用Elasticsearch Docker镜像来创建容器。要使用此映像,按如下方式增加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_countDocker
的值太低的问题。检查本教程中的所有步骤,确保您没有遗漏任何内容,然后重试。
现在Elasticsearch正在容器中运行,让我们生成一些日志并将它们摄取到Fluentd中。
使用Docker,您可以通过标准output(STDOUT
)和error(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应用程序生成大量日志,它们通常被任意格式化并存储在本地文件系统中。这可能会出现两个问题。首先,日志很难以编程方式解析,需要大量正则表达式,对于需要分析日志内容的人来说,这非常不容易。其次,日志无法实时访问,因为文本日志是批量加载到存储系统中的。更糟糕的是,如果服务器的磁盘在批量加载之间损坏,则日志会丢失或损坏。
Fluentd通过使用一致的API为各种编程语言提供记录器库,从而解决了这两个问题。每个记录器向Fluentd发送包含时间戳,标记和JSON格式事件的记录,就像您在本教程中看到的那样。有Ruby,Node.js,Go,Python,Perl,PHP,Java和C++的记录器库。记录器将数据异步发送到Fluentd,然后在将日志传送到后端系统之前缓冲日志。如果您觉得搭建起来过于繁琐,您也可以使用腾讯云容器服务,他提供了比较完整的日志分析系统。腾讯云容器服务基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。 更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Centralize Your Docker Logs with Fluentd and ElasticSearch on Ubuntu 16.04 》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。