前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu上收集Docker日志

如何在Ubuntu上收集Docker日志

原创
作者头像
好烟
发布2018-08-06 15:36:56
1.2K0
发布2018-08-06 15:36:56
举报

介绍

当您将Docker容器转移到生产环境中时,您会发现经常需要将日志保留在容器外的地方。Docker提供了一个本机日志驱动程序,可以很容易地收集这些日志并将它们发送到其他地方,例如ElasticsearchFluentdElasticsearch是是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。这样您就可以分析数据了。Fluentd是一个开源数据收集器,旨在统一您的日志记录基础架构。它将操作工程师,应用工程师和数据工程师结合在一起,使其简单且可扩展,以收集和存储日志。

Fluentd有四个关键功能,使其适合构建简洁、可靠的日志通道:

  • 使用JSON进行统一日志记录: Fluentd会尽可能地将数据结构化为JSON。这使得Fluentd能够统一处理日志数据的各个方面:收集,过滤,缓冲和输出跨多个源和目标的日志。使用JSON可以更轻松地进行下游数据处理,因为它具有足够的结构,可以在不强制使用严格模式的情况下进行访问。
  • 灵活的架构: Fluentd拥有灵活的插件系统,允许社区扩展其功能。超过300个社区贡献的插件将数十个数据源连接到数十个数据输出,根据需要操作数据。通过使用插件,您可以立即更好地使用日志。
  • 所需最低资源:数据收集器应该是轻量级的,以便在繁忙的机器上轻松地运行。Fluentd是用C和Ruby组合编写的,只需要最少的系统资源。vanilla实例运行30-40MB内存,可处理13,000个事件/秒/核心。
  • 内置可靠性:绝不应该发生数据丢失。Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。Fluentd还支持强大的故障转移功能,可以设置为高适用性。

在本教程中,您将学习如何安装Fluentd并将其配置为从Docker容器中收集日志。然后,您将数据流式传输到同一Ubuntu 16.04服务器上,运行Elasticsearch的另一个容器,并查询日志。

准备

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

第1步 - 安装Fluentd

安装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实例。

第2步 - 配置Fluentd

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捕获我们的日志。

第3步 - 启动Elasticsearch容器

我们将使用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中。

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

使用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。您在配置文件matchFluentd的部分中配置此间隔。

日志已经传送到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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第1步 - 安装Fluentd
  • 第2步 - 配置Fluentd
  • 第3步 - 启动Elasticsearch容器
  • 第4步 - 从Docker容器生成日志
  • 结论
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档