EFK家族—Fluentd日志收集

EFK家族—Fluentd日志收集介绍 Fluentd 是一个开源的数据收集器 专为处理数据流设计 使用 JSON 作为数据格式

大家好,欢迎来到IT知识分享网。

介绍

Fluentd是一个开源的数据收集器,专为处理数据流设计,使用JSON作为数据格式。它采用了插件式的架构,具有高可扩展性高可用性,同时还实现了高可靠的信息转发。具备每天收集5000+台服务器上5T的日志数据,每秒处理50000条消息的性能;

Fluentd是由Fluent+d得来,d生动形象地标明了它是以一个守护进程的方式运行。官网上将其描述为data collector,在使用上,我们可以把各种不同来源的信息,首先发送给Fluentd,接着Fluentd根据配置通过不同的插件把信息转发到不同的 地方,比如文件、SaaS Platform、数据库,甚至可以转发到另一个Fluentd。

官网

源码github

官方文档

Fluentd的作用

应用场景

EFK家族---Fluentd日志收集
EFK家族---Fluentd日志收集

EFK家族---Fluentd日志收集

特点

Fluentd原理机制

逻辑结构

EFK家族---Fluentd日志收集

代码结构

EFK家族---Fluentd日志收集

由于其简单的结构,Fluentd的核心只包含3000行Ruby。Fluentd收集各种输入源的事件并将它们写入输出接收器。 eg:输入源:HTTP, Syslog, Apache Log输出源:Files, Mail, RDBMS databases, NoSQL storages

FLuentd 的扩展性非常好,客户可以自己定制(Ruby)Input/Buffer/Output。 使用Ruby开发,Footprint会小一些。另外采用JSON统一数据/日志格式是它的另一个特点。

Fluentd安装

这里以CentOS7的为例

参考链接

安装

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh 

安装完成后可以在/usr/lib/systemd/system/td-agent目录进行启动停止操作。

$ sudo systemctl start td-agent.service $ sudo systemctl status td-agent.service 

或者

$ sudo /etc/init.d/td-agent start $ sudo /etc/init.d/td-agent stop $ sudo /etc/init.d/td-agent restart $ sudo /etc/init.d/td-agent status 

Fluentd服务的日志路径

cat /var/log/td-agent/td-agent.log 

配置文件

上面安装方式配置文件位置如下:

/etc/td-agent/td-agent.conf 

Fluentd的配置主要由source和match Block组成。

source指定输入资源

其中:

 type tail: tail方式是 Fluentd 内置的输入方式,其原理是不停地从源文件中获取新的日志。 format apache: 指定使用 Fluentd 内置的 Apache 日志解析器。 path /var/log/apache2/access_log: 指定日志文件位置。 tag mongo.apache: 指定tag,tag被用来对不同的日志进行分类 

match指定输出目的地

match标签后面可以跟正则表达式以匹配我们指定的tag,只有匹配成功的tag对应的日志才会运用里面的配置,type参数指定输出插件使用,flush_interval是用来控制多长时间将日志写入一次。 另外,可以使用include来导入单独的配置文件;

默认配置文件是通过http的方式来获取日志,输出到/var/log/td-agent/td-agent.log路径。

可以使用如下命令发送日志:

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test 

其他配置

端口说明

<source> @type debug_agent bind 127.0.0.1 port 24230 </source> 

0.0.0.0:8888是用来接收日志信息的Log HTTP Service,可以直接通过HTTP送Log进来。不需要认证直接发送信息

curl -X POST -d 'json={"message":"show me!"}' http://localhost:8888/td.myTag.test 

对应配置信息如下:

<source> @type http port 8888 </source> 

0.0.0.0:24224是Forward Service,可以用来接收其他Fluentd传送过来的Log,对应配置如下:

<source> @type forward </source> 

更多配置参考链接

注意事项

sudo sed -i "s/TD_AGENT_USER=td-agent/TD_AGENT_USER=root/g" /etc/init.d/td-agent sudo sed -i "s/TD_AGENT_GROUP=td-agent/TD_AGENT_GROUP=root/g" /etc/init.d/td-agent 

上述命令会修改这两个参数

TD_AGENT_USER=td-agent TD_AGENT_GROUP=td-agent 

修改后重启服务

sudo service td-agent restart 

监听apache输出到mongodb示例

输入

<source> @type tail path /var/log/apache2/access_log pos_file /var/log/td-agent/apache2.access_log.pos <parse> @type apache2 </parse> tag mongo.apache.access </source> 

输出

<match mongo.> # plugin type @type mongo # mongodb db + collection database apache collection access # mongodb host + port host localhost port 27017 # interval <buffer> flush_interval 10s </buffer> # make sure to include the time key <inject> time_key time </inject> </match> 

测试,访问apache服务10次,使用ab命令Apache Bench。

ab -n 100 -c 10 http://localhost/ 

查看mongodb内容如下:

$ mongo > use apache > db["access"].findOne(); { "_id" : ObjectId("4ed1ed3ace"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "44", "time" : ISODate("2011-11-27T07:56:27Z") } { "_id" : ObjectId("4ed1ed3ace"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "44", "time" : ISODate("2011-11-27T07:56:34Z") } { "_id" : ObjectId("4ed1ed3ace"), "host" : "127.0.0.1", "user" : "-", "method" : "GET", "path" : "/", "code" : "200", "size" : "44", "time" : ISODate("2011-11-27T07:56:34Z") } 

监听文件输出到ES

<source> @type tail path /var/log/syslog pos_file /var/log/td-agent/syslog.log.pos tag td.syslog format /^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/ time_format %b %d %H:%M:%S </source> <match > @type elasticsearch host localhost port 9200 index_name fluentd type_name log </match> 

其他项目中使用

很多语言都有Fluentd的插件包,可以集成后直接给Fluentd发送日志信息。

参考如下:

Python

Java

使用Fluentd管理docker容器日志

配置docker转储日志有两种方法,指定特定的容器或者配置docker daemon将所有容器日志均存储到Fluentd中。

docker中快速启动Fluentd服务,使用命令

docker run -d -p 24224:24224 -p 24224:24224/udp -v /data:/fluentd/log fluent/fluentd 

此时会在宿主机/data目录下生成data.<fluentd容器id>.log,所有收集到的日志文件将存储至此。

docker run -d --log-driver fluentd --log-opt fluentd-address=localhost:24224 --log-opt tag="nginx-test" --log-opt fluentd-async-connect --name nginx-test -p 8080:80 nginx 
2018-11-02T10:21:55+00:00 nginx-test { "container_name": "/nginx-test", "source": "stdout", "log": "172.96.247.193 - - [03/May/2018:07:21:55 +0000] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36\" \"-\"", "container_id": "0dafdsdfasweraewrfdasfdsafqwerqwerqwrqwerqwerqwfdafhgggg" } 

方法2: 设置全局log-driver

docker daemon --log-driver=fluentd 

或者

cat /etc/docker/daemon.json { "registry-mirrors": ["https://zcg96r7h.mirror.aliyuncs.com"], "log-driver": "fluentd", "log-opts": { "fluentd-address": "127.0.0.1:24224" } } 

其他配置场景

根据日志的不同来放在不同的路径

Fluentd将Docker log中stdout和stderr分开

日志采集工具的对比

转载请注明出处:EFK家族—Fluentd日志收集

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120878.html

(0)
上一篇 2025-10-26 22:10
下一篇 2025-10-26 22:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信