介绍
什么是Fluentd?
Fluentd是一个开源数据收集器,旨在统一日志记录基础架构。它旨在通过简化和扩展日志来收集和存储日志,从而将运营工程师,应用工程师和数据工程师聚集在一起。
在Fluentd之前
在Fluentd之后
Fluentd有四个关键功能,使其适合构建清洁,可靠的日志管道:
随着Docker容器在生产中推出,越来越需要将容器的日志保存在比容器更短暂的地方。
在本教程中,我们将向您展示如何安装Fluentd并使用它来从Docker容器中收集日志,并将它们存储在外部,以便在容器停止后保存数据。我们将在同一个Ubuntu 14.04服务器上将数据流式传输到运行Elasticsearch的另一个容器。
正如Kubernetes的GitHub存储库中所述,该体系结构使用Fluentd的功能来为每个容器分析和解析Docker守护程序生成的每行JSON日志文件。如需最小化设置,请参阅此配方。
在本教程结束时,我们将讨论另外两个用例。阅读本文后,您应该了解如何使用Fluentd的基础知识。
请确保完成本教程的这些先决条件。
sudo
命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)部署Fluentd最常见的方法是通过td-agent
软件包。Fluentd的原作者Treasure Data将Fluentd打包为自己的Ruby运行时,这样用户就不需要设置自己的Ruby来运行Fluentd。
目前,td-agent
支持以下平台:
在本教程中,我们假设您使用的是运行Ubuntu 14.04 LTS(Trusty)的腾讯云CVM。
使用以下命令安装td-agent
:
curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
开始td-agent
:
sudo /etc/init.d/td-agent start
检查日志以确保已成功安装:
tail /var/log/td-agent/td-agent.log
您应该看到类似于以下内容的输出:
port 24230
</source>
</ROOT>
2015-02-22 18:27:45 -0500 [info]: adding source type="forward"
2015-02-22 18:27:45 -0500 [info]: adding source type="http"
2015-02-22 18:27:45 -0500 [info]: adding source type="debug_agent"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="td.*.*" type="tdlog"
2015-02-22 18:27:45 -0500 [info]: adding match pattern="debug.**" type="stdout"
2015-02-22 18:27:45 -0500 [info]: listening fluent socket on 0.0.0.0:24224
2015-02-22 18:27:45 -0500 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
注意:或者,Fluentd可作为Ruby gem使用,可以安装
gem install fluentd
。如果您没有sudo权限,请安装Ruby并运行: gem install fluentd --no-rdoc --no-ri
现在我们将安装Docker。本教程使用Docker v1.5.0进行了测试。
添加Docker存储库的密钥,以便我们可以获得最新的Docker包:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
将存储库添加到源:
sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
更新您的系统:
sudo apt-get update
安装Docker:
sudo apt-get install lxc-docker
通过检查版本来验证是否已安装Docker:
docker --version
您应该看到如下输出:
Docker version 1.5.0, build a8a31ef
Docker以root身份运行,因此为了发出docker
命令,请将您的sudo用户添加到docker组。把sammy
替换为您选择的用户。
sudo gpasswd -a sammy docker
然后,重启Docker。
sudo service docker restart
最后,如果您当前以sudo用户身份登录,则必须注销并重新登录。
在本节中,我们将为Fluentd Docker容器创建Docker镜像。
为您的Fluentd Docker资源创建一个新目录,然后进入该目录:
mkdir ~/fluentd-docker && cd ~/fluentd-docker
创建以下内容Dockerfile
:
sudo nano Dockerfile
准确地将以下内容添加到您的文件中。该文件告诉Docker更新Docker容器并安装Ruby,Fluentd和Elasticsearch:
FROM ruby:2.2.0
MAINTAINER kiyoto@treausuredata.com
RUN apt-get update
RUN gem install fluentd -v "~>0.12.3"
RUN mkdir /etc/fluent
RUN apt-get install -y libcurl4-gnutls-dev make
RUN /usr/local/bin/gem install fluent-plugin-elasticsearch
ADD fluent.conf /etc/fluent/
ENTRYPOINT ["/usr/local/bundle/bin/fluentd", "-c", "/etc/fluent/fluent.conf"]
您还需要在同一目录中创建一个fluent.conf
文件。
sudo nano fluent.conf
该fluent.conf
文件应如下所示。您可以完全复制此文件:
<source>
type tail
read_from_head true
path /var/lib/docker/containers/*/*-json.log
pos_file /var/log/fluentd-docker.pos
time_format %Y-%m-%dT%H:%M:%S
tag docker.*
format json
</source>
# Using filter to add container IDs to each event
<filter docker.var.lib.docker.containers.*.*.log>
type record_transformer
<record>
container_id ${tag_parts[5]}
</record>
</filter>
<match docker.var.lib.docker.containers.*.*.log>
type elasticsearch
logstash_format true
host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature
port 9200
flush_interval 5s
</match>
此文件的目的是告诉Fluentd在哪里可以找到其他Docker容器的日志。
然后,构建您的Docker镜像,名为fluentd-es
:
docker build -t fluentd-es .
这将需要几分钟才能完成。检查您是否已成功构建图像:
docker images
你应该看到这样的输出:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
fluentd-es latest 89ba1fb47b23 2 minutes ago 814.1 MB
ruby 2.2.0 51473a2975de 6 weeks ago 774.9 MB
现在返回到您的Elasticsearch容器的主目录或首选目录:
cd ~
下载并启动Elasticsearch容器。已有一个自动构建:
docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch
等待容器映像下载并启动。
接下来,通过检查Docker进程,确保Elasticsearch容器正常运行:
docker ps
你应该看到这样的输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c474fd99ce43 dockerfile/elasticsearch:latest "/elasticsearch/bin/ 4 minutes ago Up 4 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es
现在我们将启动运行Fluentd的容器,收集日志,并将它们发送到Elastcisearch。
docker run -d --link es:es -v /var/lib/docker/containers:/var/lib/docker/containers fluentd-es
在上面的命令中,该--link es:es
部分将Elasticsearch容器链接到Fluentd容器。需要使用该-v /var/lib/docker/containers:/var/lib/docker/containers
部分将主机容器的日志目录装入Fluentd容器中,以便Fluentd可以在创建容器时拖尾日志文件。
最后,通过检查我们的活动Docker进程来检查容器是否正在运行:
docker ps
这次,您应该看到Elasticsearch容器和新fluentd-es
容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f0d2cac81ac8 fluentd-es:latest "/usr/local/bundle/b 2 seconds ago Up 2 seconds stupefied_brattain
c474fd99ce43 dockerfile/elasticsearch:latest "/elasticsearch/bin/ 6 minutes ago Up 6 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es
最后,让我们确认Elasticsearch正在接收事件:
curl -XGET 'http://localhost:9200/_all/_search?q=*'
输出应包含如下所示的事件:
{"took":66,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
{"took":59,"timed_out":false,"_shards":{"tod","_id":"AUwLaKjcnpi39wqZnTXQ","_score":1.0,"_source":{"log":"2015-03-12 00:35:44 +0000 [info]: following tail of /var/lib/docker/containers/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9-json.log\n","stream":"stdout","container_id":"6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9","@timestamp":"2015-03-12T00:35:44+00:00"}}]}}
根据您的设置,您可能会记录相当多的事件。单个事件应以{"took":
开头并以时间戳结束。
如此输出所示,Elasticsearch正在接收数据。(您的容器ID将与上面显示的不同!)
从Docker容器收集日志只是使用Fluentd的一种方法。在本节中,我们将介绍Fluentd的另外两个常见用例。
许多用户来到Fluentd构建一个既可以进行实时日志搜索又可以进行长期存储的日志管道。架构看起来像这样:
该架构利用了Fluentd复制数据流并将其输出到多个存储系统的能力。在上面的设置中,Elasticsearch用于实时搜索,而MongoDB和/或Hadoop用于批量分析和长期存储。
Web应用程序生成大量日志,并且它们通常被任意格式化并存储在本地文件系统中。这有两个原因:
Fluentd通过以下方式解决了这些问题:
资源:
更多Ubuntu教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Centralize Your Docker Logs with Fluentd and ElasticSearch on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。