来自第Fluentd
介绍
当您将Docker容器转为生产环境时,您会发现越来越需要将日志保留在比容器更短暂的位置。Docker窗附带了Fluentd本地日志记录的驱动程序,因此很容易收集这些日志和途径在别的地方,像 Elasticsearch ,这样你就可以分析数据。 Fluentd是一个开源的数据采集器设计为统一的日志基础设施。它通过使操作工程师,应用程序工程师和数据工程师简单和可扩展地收集和存储日志,使它们结合在一起。 Fluentd有四个主要功能,使其适合于构建清洁,可靠的测井管道:- 使用JSON统一日志记录:Fluentd试图构建数据作为JSON尽可能。这允许Fluentd统一处理日志数据的所有方面:在多个源和目标中收集,过滤,缓冲和输出日志。使用JSON,下游数据处理更容易,因为它具有足够的结构,无需强制使用刚性模式即可访问。
- 可插拔架构:Fluentd有一个灵活的插件系统,让社区来扩展其功能。超过300个社区提供的插件将数十个数据源连接到数十个数据输出,根据需要处理数据。通过使用插件,您可以更好地使用您的日志马上。
- 最少的资源要求:一个数据收集要轻巧,使其舒适地运行一个繁忙的机器上。 Fluentd是以C和Ruby的组合编写的,并且需要最少的系统资源。香草实例运行在30-40MB内存,可以处理13,000个事件/秒/核心。
- 内置的可靠性:数据丢失情况不应该发生。 Fluentd支持基于内存和文件的缓冲,以防止节点间数据丢失。 Fluentd还支持强大的故障转移,并且可以设置为高可用性。
先决条件
要完成本教程,您需要以下内容:- 一个4GB的Ubuntu 16.04服务器通过以下设置了Ubuntu 16.04的初始服务器安装指南 ,包括Sudo非root用户和防火墙。这满足Elasticsearch的内存要求。
- 在服务器上安装了由以下Docker如何安装和在Ubuntu 16.04使用Docker 。确保配置Docker作为非root用户运行。
第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
您将看到类似于以下内容的输出:
Output 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协议。 当日志记录进来,,他们将有一些额外的相关领域,包括
time
,
tag
,
message
,
container_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
你应该看到这样的输出:
OutputCONTAINER 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。您可能会发现以下链接有趣:- 统一日志记录层更多地了解记录层是如何工作的。
- ,以了解更多有关如何使用Elasticsearch工作。
- 添加仪表板可让您看到您的日志。
- Fluentd + Elasticsearch为Kubernetes由萨特南·辛格,Kubernetes提交者。