fluentd收集日志文件

默北 大数据fluentd收集日志文件已关闭评论27,1142字数 4254阅读14分10秒阅读模式

fluentd

Fluentd是一个收集日志文件的开源软件,目前提供数百个插件可用于存储大数据用于日志搜索,数据分析和存储。

Fluentd适用于以下场景。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

  • 收集多台服务器的访问日志进行可视化
  • 在AWS等云端使用AutoScaling时把日志文件收集至S3(需要安装插件)
  • 收集客户端的信息并输出至Message Queue,供其他应用处理

安装fluentd

在CentOS安装flentd有 RPM安装、source安装、Ruby Gem安装 3种方法,无论用何种方法安装相对简单。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

在这里使用RMP安装方法,以下的方法支持在 CentOS、RHEL 5, 6, 7、Amazon Linux 执行。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

install-redhat-td-agent2.sh脚本会在我们的主机上安装fluent agent,该脚本首先会追加 rmp源到/etc/yum.repos.d/td.repo文件,并以rpm方法安装td-agent。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

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

启动及停止fluentd

使用systemctl命令设定为开机自动启动。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

# systemctl enable td-agent.service

systemctl start 命令启动fluent agent。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

# systemctl start td-agent.service

停止fluent agent使用 systemctl stop命令。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

# systemctl stop td-agent.service

安装之后默认配置文件为 /etc/td-agent/td-agent.conf,该配置文件默认是http为输入并输出至/var/log/td-agent/td-agent.log文件,可用以下命令进行测试。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

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

查看 /var/log/td-agent/td-agent.log 文件。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

2017-05-09 12:21:56 +0800 [info]: listening fluent socket on 0.0.0.0:24224
2017-05-09 12:21:56 +0800 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2017-05-09 12:45:40 +0800 debug.test: {"json":"message"}

fluentd的3个指令

配置文件里指定”source“、”match“及”include“3个指令(directive)。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

source指令决定从哪里读取日志,关键字type指定启用插件后配置相关参数。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

<source>
  type <指定插件>
  <设定项1> <设定值>
  <设定项2> <设定值>
  :
  :
</source>

match指令设定当满足指定条件时如何处理日志的方法,在source指令追加的标签(tag)满足match指令的条件时,该日志将被指定插件处理。编写格式基本于source相同只是在match后面多了一个条件指定。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

<match <条件>>
  type <指定插件>
  <设定项1> <设定值>
  <设定项2> <设定值>
  :
  :
</match>

条件可使用「*」、「**」及「{}」正则表达。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

符号 说明
* 匹配任意字符,但是必须存在
** 匹配任意字符,当不存在时也匹配
{} 至少匹配括号里的一个单元

例如条件为「a.*」时匹配「a.b」标签而不匹配「a」及「a.b.c」标签,当条件为「a.**」时匹配「a」、「a.b」及「a.b.c」标签。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

{}提供or演算符的功能,例如「{a, b, c}」条件将会匹配「a」、「b」及「c」标签。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

也可组合使用以上正则表达如「a.{b, c}.*」匹配「a.b.*」及「a.c.*」。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

最后include指令是读取其他配置文件,格式如下。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

include <其他配置文件>

配置文件可使用绝对路径或相对路径的方式指定,并且可使用「*」符号。甚至可以指定配置文件的URL,就是可通过网络读取其他主机的配置文件。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

输入及输出插件

fluentd的输入及输出处理都以插件形式提供,下面介绍一下fluentd默认插件。文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

默认输入插件有6个,在这里简单介绍一下,相关的详细信息参照 fluentd官网输入插件信息文章源自运维生存时间-https://www.ttlsa.com/bigdata/fluentd-collect-logfile/

插件名称 说明
in_forward 使用TCP/IP接收事件信息,主要用于从其他fluentd或各种编程语言日志输出模块接收事件信息。
in_http 通过HTTP的POST请求接收事件信息。
in_tail 监视指定日志文件,当有事件信息被添加至该日志文件时进行接收。
in_exec 执行指定的外部程序,并把该外部程序的输出信息以事件信息接收。外部程序将会永久或按一定间隔定期执行。
in_syslog syslog的UDP接收事件信息。
in_scribe Facebook开发的日志收集服务「Scribe」协议接收事件信息。

默认输出插件有12个,详细信息参照 fluentd官网输出插件信息

插件名称 类别 说明
out_copy Non-Buffered 输出日志至一个以上的目标地址
out_null Non-Buffered 不进行输出
out_roundrobin Non-Buffered 以轮询调度方式向一个以上的目标地址进行输出
out_stdout Non-Buffered 输出至标准输出(一般标准输出是显示屏)
out_exec_filter Buffered
out_forward Buffered 通过网络向其他fluentd进行输出
out_mongo Buffered 输出至MongoDB
out_mongo_replset 输出至MongoDB
out_exec Time Sliced
out_file Time Sliced 输出至指定文件
out_s3 Time Sliced 保存至Amazon S3存储
out_webhdfsQ Time Sliced 保存至HDFS(Hadoop Distributed File System)

输出插件有即时进行输出的「Non-Buffered」,累积一定的事件信息之后进行处理的「Buffered」及一定间隔进行输出的「Time Sliced」3种类型。使用「Buffered」输出插件时可指定Buffer设备,Buffer设备可指定内存(memory)及文件(file)。

fluentd记录Apache访问日志

fluentd最基本的设定方法以Apache访问日志为例进行介绍,输入插件使用 in_tail 在保存Apache默认日志文件的同时使用fluentd进行记录。

in_tail插件监视指定文件当有文件有追加时,把追加内容以事件信息接收。但是Apache日志文件一般会使用logrotate工具隔一段时间切换日志文件并进行压缩,而使用 in_tail 插件时无需考虑logrotate影响因为该插件支持日志切换及压缩。

这次介绍的以下场景下对Apache访问日志的设定,如配置其他应用程序的日志文件需确认日志文件路径及格式。

  • Apache日志文件:/var/log/httpd/access_log
  • 日志文件格式:combined

事件信息收集设定

首先需要配置从哪里收集信息。

# gather apache access log
<source>
  type tail  ← 指定in_tail插件
  path /var/log/httpd/access_log  ← 指定日志文件路径
  tag apache.access  ← 指定标签,该标签用于 match 条件
  pos_file /var/log/td-agent/httpd-access_log.pos  ← 保存Apache log文件读取位置信息
  format apache2  ← 指定解析的日志文件格式
</source>

推荐配置「pos_file」参数,虽然不是必须配置的参数,是记录被监视文件读取位置(如第10行为止已读取)的重要文件。

in_tail插件提供读取追加内容后解析&转换为JSON格式的功能,「format」参数可指定如下正则表达式,并等于apache2。

/^(?[^ ]*) [^ ]* (?[^ ]*) \[(?[^\]]*)\] "(?\S+)(?: +(?[^ ]*) +\S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\"]*)" "(?[^\"]*)")?$/

转换之后的JSON格式如下。

{
  "host": "**.***.***.***",
  "user": null,
  "method": "GET",
  "path": "/path/to/resource/",
  "code": 200,
  "size": 143320,
  "referer": "http://example.com/path/to/file",
  "agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch; MDDCJS)"}
}

使用 out_file 插件进行日志文件的保存。

<match apache.access>  ← 指定标签
  type file  ← 指定out_file插件
  path /var/log/td-agent/httpd/access.log  ← 指定输出文件
  time_slice_format %Y%m%d  ← 文件添加日期信息
  time_slice_wait 10m  ← 文件添加日期信息
  compress gzip  ← gzip压缩输出文件
</match>

out_file插件不仅是输出信息至文件,还可以根据 time_slice_format 参数值进行输出文件的切换,例如参数值为 %Y%m%d 时,输出文件名根据日期后缀变为 .<年><月><日>。

需注意的是在fluentd,事件发生时间和fluentd接收事件信息时间有时会发生时差,因此会出现输出文件日期和实际内容不相符的情况。例如23:55发生的事件信息的接收事件是0:01,这时用日期切换输出文件可能会导致该事件信息的丢失。这时可指定 time_slice_wait 参数,该参数是out_file插件根据日期分割输出文件之后,等待多长时间之后向新文件输出信息,在这里10m是10分钟。

并且输出文件可以根据文件大小进行分割默认是256MB,可使用 buffer_chunk_limit 参数进行修改。

完成以上配置之后,重新读取fluentd配置文件即会生效。

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
默北
  • 本文由 发表于 18/10/2017 16:26:24
  • 转载请务必保留本文链接:https://www.ttlsa.com/bigdata/fluentd-collect-logfile/