Fluentd Conf

Tag

  • source:确定输入源
  • match: 确定输出目的地
  • filter:确定 event 处理流
  • system:设置系统范围的配置
  • label:将内部路由的输出和过滤器分组
  • @include:包括其它文件

Syntax

Event structure

  • tag: 事件来自何处
  • time: 事件发生事件(原子时间)
  • record: log内容(json)

Processing Events

  • Filters
  • Labels
  • Buffers

Source

Fluentd支持多输入。每一个输入配置必须包含类型/type,比如tcp数据输入,或者http类型输入。type将指定使用的input plugin。

以下的示例中就定义了两个输入源,一个是从24224端口进入的tcp数据流,另一个是从9880端口进入的http数据。

1
2
3
4
5
6
7
8
9
10
11
12
# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
<source>
@type forward
port 24224
</source>

# http://this.host:9880/myapp.access?json={"event":"data"}
<source>
@type http
port 9880
</source>

举例说明

  • tail
1
2
3
4
5
6
7
<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>
  1. 配置tail,表示从日志文件的尾部开始读取;如果是新文件,则从头开始读。
  2. 重启后,从pos文件读取上次读取位置。
  • path:路径读取。可以指定多个路径“、“分离。(可以同时收集多个log日志,而不用在重新起一个source)

  • tag:The tag of the event

  • format:日志的格式

支持:regexp 和 正则表达式

Example:Apache

1
2
3
# 读取日志文件apache的为以下字段:主机、用户、时间、方法、路径、代码、大小、推荐人和代理
format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
time_format %d/%b/%Y:%H:%M:%S %z

Example:syslog

1
2
3
# 读取syslog的输出文件(例如,/var/log/syslog)对下列字段:时间、主机,识别,和消息
format /^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[a-zA-Z0-9_\/\.\-]*)(?:\[(?<pid>[0-9]+)\])?[^\:]*\: *(?<message>.*)$/
time_format %b %d %H:%M:%S
  • time_key:用来确定记录的时间戳。时间戳是当Fluentd读取记录是默认情况下使用的。

  • pos_file(必不可少):Fluentd将记录它上次读到这个文件的位置。

Example

1
pos_file /var/log/td-agent/tmp/access.log.pos
  • time_format:时间格式

Match

Match配置了数据流的匹配规则和匹配成功后所需执行的动作,和路由表项类似。

比如以下的配置中就对匹配myapp.access标签成功的数据包执行file类型动作,将数据写入到路径为/var/log/fluent/access的文件中。

1
2
3
4
5
6
7
8
# Match events tagged with "myapp.access" and
# store them to /var/log/fluent/access.%Y-%m-%d
# Of course, you can control how you partition your data
# with the time_slice_format option.
<match myapp.access>
@type file
path /var/log/fluent/access
</match>

Filter


System


Label


@include


Plugin

Fluentd有5种类型的插件,分别是:

  • Input:完成输入数据的读取,由source部分配置
  • Parser:解析插件
  • Output:完成输出数据的操作,由match部分配置
  • Formatter:消息格式化的插件,属于filter类型
  • Buffer:缓存插件,用于缓存数据

Route

Route指的是数据在Fluentd中的处理流水线,一般的流程为

  • input -> filter -> output
  • input -> filter -> output with label

即由输入插件获取数据,然后交给filter做处理,然后交给output插件去转发。同时,也支持数据包/事件的重新提交,比如修改tag之后重新路由等等。

  • reroute event by tags
  • reroute event by record content
  • reroute event to other label

https://docs.fluentd.org/v0.12/articles/routing-examples

Fluentd to Fluentd

Server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Takes the messages sent over TCP
<source>
@type forward
port 24224
bind 0.0.0.0
</source>

<match **>
@id fluentd-server
@type elasticsearch
@log_level info
include_tag_key true
host elasticsearch
port 9200
logstash_format true
index_name fluentd
type_name fluentd

<buffer>
@type file
path /var/log/fluentd/kubernetes.system.buffer
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 5s
retry_forever
retry_max_interval 30
chunk_limit_size 2M
queue_limit_length 4
overflow_action block
</buffer>
</match>

Client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
containers.input.conf: |-
<source>
@id fluentd-containers.log
@type tail
path /var/log/containers/*.log
pos_file /var/log/es-containers.log.pos
time_format %Y-%m-%dT%H:%M:%S.%NZ
tag raw.kubernetes.*
read_from_head true
<parse>
@type multi_format
<pattern>
format json time_key time
time_format %Y-%m-%dT%H:%M:%S.%NZ
</pattern>
<pattern>
format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
time_format %Y-%m-%dT%H:%M:%S.%N%:z
</pattern>
</parse>
</source>

# Detect exceptions in the log output and forward them as one log entry.
<match raw.kubernetes.**>
@id raw.kubernetes
@type detect_exceptions
remove_tag_prefix raw
message log
stream stream
multiline_flush_interval 5
max_bytes 500000
max_lines 1000
</match>

output.conf: |-
# Enriches records with Kubernetes metadata
<filter kubernetes.**>
@type kubernetes_metadata
</filter>

<match **>
@type forward
time_format %Y-%m-%dT%H:%M:%S.%N%:z
<server>
host fluentd-service
port 24224
</server>
flush_interval 1s
</match>

Refer to

https://blog.csdn.net/hxpjava1/article/details/79447630

http://www.muzixing.com/pages/2017/02/05/fluentdru-men-jiao-cheng.html