用Fluentd实现收集日志到HDFS(下)

来源:互联网 发布:女生休闲鞋推荐 知乎 编辑:程序博客网 时间:2024/06/01 20:30

本篇主要包含Fluentd的配置文件格式,in_tail输入插件,out_webhdfs输出插件的部分内容。

Fluentd的配置文件主要包含以下字段

  1. source,决定数据来源
  2. match,决定输出目的地
  3. filter,在输入与输出之间,用来过滤
  4. system,用来进行系统设置

from:http://docs.fluentd.org/articles/config-file

source字段

指定input plugin,input plugin提交事件到路由引擎。一个事件包含3个实体:tag,time,record。
tag是一个用点号分隔的字符串,用来指示内部路由引擎的方向。
time是由input plugins指定的,必须是Unix时间格式。
record是一个JSON对象。
强烈建议tag只使用小写字母,数字和下划线。
例如:

<source>  type http  port 9880</source>

执行

curl -X POST -d 'json={"json":"message"}' http://127.0.0.1:9880/td.temp

td.temp就是tag,{"json":"message"}就是record,time由系统自动确定。

match字段

处理符合其tag的事件。
match的匹配模式:

*匹配单个tagFor example, the pattern a.* matches a.b, but does not match a or a.b.c**匹配0或多个tag{X,Y,Z}匹配X,Y,或Z, 这里的X, Y, Z也可以是匹配模式例如,a.{b,c}.*匹配a.b.*和a.c.*若需要同时匹配几个模式,模式之间用空格分开

匹配顺序只是简单的按照配置文件中match标签的顺序。

过滤器

Input -> filter 1 -> … -> filter N -> Output

system标签

用来进行系统设置,可以通过命令选项进行同样的设置。

in_tail插件

从文本文件的末尾读取,它的行为类似tail -F命令。
in_tail内置于Fluentd的内核。
一个例子:

<source>  type tail  path /var/log/httpd-access.log  pos_file /var/log/td-agent/httpd-access.log.pos  tag apache.access  format apache2</source>

它是怎么工作的?
靠inode号来识别文件,首次配置成in_tail时,将从日志文件的尾部而不是开头读取,但如果log文件发生rotate,其inode发生改变,将从文件的开头读取。比如日志文件太大,将其重命名为其他名字,然后新建一个原名字的日志文件。

参数

type,必须
值必须是tail。

tag,必须
可用*作为占位符,此时它将path参数的/替换为.。

path,必须
读取的路径,多个路径用逗号分隔。
可以用*和时间格式字符串来动态添加/删除文件,每过refresh_interval间隔,Fluentd将刷新监视文件列表,例如:
path /path/to/%Y/%m/%d/*
假设现在是20140401,Fluentd将监视/path/to/2014/04/01路径下的所有文件。
注意:
如果文件会有rotation,不要使用*,因为这会引起重复。

exclude_path
用来从path中排除一些文件。例如:

path /path/to/*exclude_path ["/path/to/*.gz", "/path/to/*.zip"]

refresh_interval
刷新监控文件列表的时间间隔,默认60s。

read_from_head
从开头读取日志文件,而不是从结尾,默认false。
如果你要监控*表示的多个文件,或时间字符串指定的动态路径,需将其设置为true;
否则,应该保证log rotation不会出现在*路径里。

format,必须
日志文件的格式,支持regexp,apache2,apache_error,nginx,syslog等。
如果值以/开始和结尾,被认为是一个正则表达式。正则式至少一个命名的捕获(?<name>pattern),每个名字都作为json字符串的key值。例如:

(?<name>[a-z])(?<list>[a-z]+)

将fsfd匹配成:

{"name":"f","list":"sfd"}

如果正则式中有time这个名字的捕获,你可以用time_format参数来指定时间的格式。

pos_file,推荐进行设置
用来记录上次读取的位置。

time_format
只有当format包含time字段时才有效。

参考于:http://docs.fluentd.org/articles/in_tail

out_webhdfs

默认情况下,每一小时在HDFS上创建一次文件。这意味着,当你第一次导入记录时,并没有立刻生成文件。time_slice_format条件达到时,才会创建文件。

参数
type (required)
The value must be webhfds.
host (required)
The namenode hostname.
port (required)
The namenode port number.
path,必须
HDFS上的路径,请在path中包含${hostname}来避免在多个Fluentd实例中写入同一个HDFS文件。path可以包含时间占位符,此时自动配置time_slice_fomat。

高级使用,你可以通过修改下面的参数来调整Fluentd的内部缓存机制。
time_slice_format
此参数用来作为文件名的一部分,当创建文件时下面的字符将被替换为实际值:
• %Y: year including the century (at least 4 digits)
• %m: month of the year (01..12)
• %d: Day of the month (01..31)
• %H: Hour of the day, 24-hour clock (00..23)
• %M: Minute of the hour (00..59)
• %S: Second of the minute (00..60)
默认格式是%Y%m%d%H,一小时创建一个。此参数可能被path配置覆盖。

参考于:http://docs.fluentd.org/articles/out_webhdfs


未完待续,如果今后有需要会深入了解。

0 0