Input, Parser, Engine, Filter, Buffer, Output, Formatter 7개의 컴포넌트로 구성
<source>
@type tail
path /var/log/httpd-access.log
pos_file /var/log/td-agent/httpd-access.log.pos
tag apache.access
<parse>
@type apache2
</parse>
</source>
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<source>
@type http
port 9880
bind 0.0.0.0
body_size_limit 32m
keepalive_timeout 10s
</source>
Filter 플러그인을 읽어들인 데이터를 Output으로 보내기 전에, 다음과 같은 3가지 기능을 합니다.
<filter></filter>
내부에서 filter plugin(record_transformer, grep 등)을 사용합니다.
<filter foo.bar>
@type record_transformer
<record>
hostname "#{Socket.gethostname}"
</record>
</filter>
<source>
에서 tar가 foo.bar 로 설정되어 읽어온 log 중에,<filter foo.bar>
@type grep
<regexp>
key message
pattern /cool/
</regexp>
<regexp>
key hostname
pattern /^web\d+\.example\.com$/
</regexp>
<exclude>
key message
pattern /uncool/
</exclude>
</filter>
<filter foo.bar>
@type parser
key_name log
<parse>
@type regexp
expression /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)$/
time_format %d/%b/%Y:%H:%M:%S %z
</parse>
</filter>
<match></match>
에서 <buffer></buffer>
를 사용하여 input 에서 들어온 log를 특정데이터 크기 제한까지 도달하면 output으로 보내도록 할 수 있습니다.Buffer에는 로그 데이터를 분리하는 Tag 단위로 Chunk가 생성이 됩니다.
Chunk에 데이터가 쌓여서 buffer_chunk_limit만큼 Chunk가 쌓여서 full이 되거나, 설정값에 의해 정의된 flush_interval 주기가 되면 로그 저장소로 로그를 쓰기 위해서 Queue에 전달이 됩니다.
Queue가 차버렸을 때 다른 처리 방법으로는 큐가 다 찼을 때, Secondary output을 지정해서, 다른 로그 저장소에 로그를 저장하는 방법이 있을 수 있습니다.
ex) secondary output을 AWS S3로 지정해 놓고, S3로 로그를 일단 저장하게 하고 나중에 mongodb가 복구된 후에, S3에서 다시 mongodb로 로그를 수집하는 방식을 취할 수 있습니다.
<match></match>
내부에서 output plugin(file, stdout, forward등)을 사용해서 출력합니다.<match pattern>
@type file
path /var/log/fluent/myapp
compress gzip
<buffer>
timekey 1d
timekey_use_utc true
timekey_wait 10m
</buffer>
</match>
<match **>
@type stdout
</match>
<match **>
@type forward
<server>
name another.fluentd1
host 127.0.0.1
port 24224
weight 60 # 로드밸런싱 가중치 설정
</server>
<server>
name another.fluentd2
host 127.0.0.1
port 24225
weight 40
</server>
</match>
Input 플러그인을 통해서 들어온 데이터를 읽어도 데이터 포맷이 Fluentd에서 지원하지 않는 데이터 포맷인 경우가 있기 때문에 이를 파싱하기 위해 Parser 플러그인을 선택적으로 사용할 수 있습니다.
(Regular Expression, Apache, Nginx, Syslog, ..)
<source><source>
, <match><match>
, <filter></filter>
안에서 <pasre></parse>
형식으로 사용합니다.
전달받은 데이터를 파싱하기 위해서 @type 파라미터로 regexp, apache2, apache_error, nginx, syslog, csv, tsv, ltsv, json, multiline, none 과 같은 Parser plugin을 사용합니다.
Output 플러그인을 통해 데이터를 저장소에 쓸 때, Formatter를 이용하면 데이터의 포맷을 정의할 수 있습니다.
ex) Input의 parser가 포맷에 맞게 읽는 플러그인이라면, Formatter는 Output을 위한 포맷을 지정하는 플러그인)
<match></match>
안에서 <format></format>
형식으로 사용합니다.
출력 형식을 변경 할 수 있습니다. @type 파라미터로 out_file, json, ltsv, csv, msgpack, hash, single_value, tsv 와 같은 Formatter plugin 을 사용합니다.
Fluentd가 내부적으로 어떻게 로그 데이터를 핸들링하는지 데이터 구조를 확인해보겠습니다.
데이터는 크게 3가지 파트로 구성이 됩니다.
/etc/td-agent/td-agent.conf
<ROOT>
<match td.*.*>
type tdlog
apikey xxxxxx
auto_create_table
buffer_type file
buffer_path /var/log/td-agent/buffer/td
<secondary>
type file
path /var/log/td-agent/failed_records
buffer_path /var/log/td-agent/failed_records.*
</secondary>
</match>
<match debug.**>
type stdout
</match>
<source>
type forward
</source>
<source>
type http
port 8888
</source>
<source>
type debug_agent
bind 127.0.0.1
port 24230
</source>
</ROOT>