이 설정 파일을 수정하여 사용자 정의하기 전에 몇가지 문법을 확인해 보자.
설정 파일에서 쓰이는 지시자(Directives) 목록은 다음과 같다.
– source : 입력 형태 결정.
– match : 출력 목적지 결정
– filter : 이벤트 처리 파이프라인 결정
– system : 시스템 광역 설정
– label : 내부 라우팅을 위한 출력 및 필터를 그룹화
– @include : 다른 설정 파일 삽입
1. source
input 플러그인을 매개변수로 하는 지시자로 어떤 방식으로 이벤트를 입력받을 것인지 설정한다.
Fluentd 의 표준 input 플러그인에는 http 와 forward 가 있다.
http 플러그인은 fluentd 를 HTTP 엔드포인트로 바꿔 HTTP 메시지를 전달 받는다.
forward 플러그인은 fluentd 를 TCP 엔드포인트로 바꿔 TCP 패킷을 전달 받는다.
원하는 만큼 source 지시자를 추가하여 동시에 여러개의 이벤트를 받아들일 수 있다.
각 source 지시자에 사용할 input 플러그인을 tyep 파라미터(@type) 에 설정한다.
사이트에서 더 많은 input plugin 리스트를 확인할 수 있다. (http://docs.fluentd.org/v0.12/articles/input-plugin-overview)
# 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>
|
cs |
source 는 Fluentd 의 라우팅 엔진에 이벤트를 전송한다. 이벤트는 tag, time, record 의 세 엔티티로 구성된다.
– tag 는 마침표 ‘.’ (예: myapp.access) 로 구분된 문자열이며 Fluentd 내부 라우팅 엔진의 지침으로 사용된다.
– time 필드는 input 플러그인으로 부터 지정되며 Unix 시간 형식이어야 한다.
– record 는 JSON 객체이다.
tag 는 모든 문자를 허용하지만, output 플러그인에서 다른 컨텍스트로 전달되어 사용(예: table / database / key name 등) 되기 때문에 되도록 소문자, 숫자, 밑줄 정도만 사용하는 것이 좋다. (정규식: ^[a-z0-9_]+$)
위의 예에서 HTTP input 플러그인으로 이벤트를 전송하는 예제이다.
# generated by http://this.host:9880/myapp.access?json={“event”:”data”}
tag: myapp.access
time: (current time)
record: {“event”:“data”}
|
cs |
2. match
match 지시자은 source 지시자로부터 전달받은 이벤트 중 일치하는 tag 가 있는 이벤트만을 찾아 처리한다.
주로 다른 시스템에 이벤트를 출력하는 등의 동작을 하여 output 플러그인이라고 한다.
Fluentd 의 표준 output 플러그인은 file 과 forward 가 있다.
file 은 다른 파일에 출력을 기록할 때, forward 는 다른 서버로 출력을 보낼 때 사용한다.
# 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>
# 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>
|
cs |
각 match 지시자은 tag 와 매칭할 패턴 및 사용할 output 플러그인을 지정하는 type 파라미터(@type) 를 포함해야 한다.
패턴과 일치하는 tag 의 이벤트만 output 목적지로 전송된다. (위의 예에서는 “myapp.access” 태그가 있는 이벤트만 일치).
match 패턴
– * 는 tag 의 마침표(.)로 구분된 한 파트와 매칭 : a.* 는 a.b 와 일치, a 나 a.b.c 와 불일치)
– ** 는 tag 의 마침표(.)로 구분된 모든 파트와 매칭 : a.** 는 a, a.b, a.b.c 와 일치
– {X,Y,Z} 는 X tag, Y tag, Z tag 등이 매칭. 여러 tag 리스트를 콤마로 구분해 지정할 수 있으며 *,** 도 사용 가능하다. : a.{b,c.**} 는 a.b 나 a.c.** 와 일치
– 하나의 match 지시자안에 여러개의 패턴을 공백으로 구분할 수도 있다.
match 순서
match 지시자도 여러 개를 사용할 수 있으며 상단에 쓰여진 순서대로 일치 여부를 판단한다.
아래처럼 match 지시자가 있을 때 두번째 match 지시자(myapp.access 패턴) 는 불려질 수 없다.
# ** matches all tags. Bad 🙁
<match **>
@type blackhole_plugin
</match>
<match myapp.access>
@type file
path /var/log/fluent/access
</match>
|
cs |
마찬가지로 사이트에서 더 많은 output plugin 리스트를 확인할 수 있다. (http://docs.fluentd.org/v0.12/articles/output-plugin-overview)
3. filter
filter 지시자는 match 와 동일하지만, 또 다른 filter 로 전달이 가능하다. (chained pipeline)
Input -> Output 플로우가 filter 를 거치면 Input -> filter 1 -> … -> filter N -> Output 가 된다.
아래는 표준 filter 인 record_transformer 를 사용한 예이다.
# http://this.host:9880/myapp.access?json={“event”:”data”}
<source>
@type http
port 9880
</source>
<filter myapp.access>
@type record_transformer
<record>
host_param “#{Socket.gethostname}”
</record>
</filter>
<match myapp.access>
@type file
path /var/log/fluent/access
</match>
|
cs |
먼저 {“event”:”data”} 이벤트는 record_transformer 플러그인을 사용하여, 이벤트에 “host_param” 이라는 필드를 추가하고, 추가된 필드 {“event”:”data”,”host_param”:”webserver1″} 를 match 지시자의 file output 으로 보낸다.
<filter> 순서 역시 <match> 과 동일하게 쓰여진 순서대로 처리되므로 <match> 전에 <filter> 가 들어가야 한다.
4. system
system 지시자로 지정되는 다음 설정들은 fluentd 콘솔 명령의 옵션들과 동일하다.
log_level – 로그 표시 수준
suppress_repeated_stacktrace – true 로 설정되면 로그에 stacktrace 를 숨김 (기본값)
emit_error_log_interval – 오류 로그를 내보내는 시간 간격(초)
suppress_config_dump – 설정 파일의 내용이 로그에 표시되지 않음.
without_source – input 플러그인 없이 시작 (오래된 버퍼를 비울때 유용)
process_name – 프로세스 이름 변경
<system>
# equal to -qq option
log_level error
# equal to –without-source option
without_source
# …
</system>
|
cs |
5. label
label 지시자는 내부 라우팅을 위한 ouput 및 filter 를 그룹화하여, tag 처리의 복잡성을 줄여준다.
tag 접두사 없이 이벤트를 구분할 때 특히 유용하다.
label 은 내장 플러그인 파라미터이므로 매칭시킬 때는 아래 예제처럼 @ 접두사를 붙여 준다.
<source>
@type forward
</source>
<source>
@type tail
@label @SYSTEM
</source>
<filter access.**>
@type record_transformer
<record>
# …
</record>
</filter>
<match **>
@type elasticsearch
# …
</match>
<label @SYSTEM>
<filter var.log.middleware.**>
@type grep
# …
</filter>
<match **>
@type s3
# …
</match>
</label>
|
cs |
위 설정에서 forward 이벤트는 elasticsearch output 으로 라우트되고, in_tail 이벤트는 @SYSTEM label 의 grep filter 와 s3 ouput 으로 라우트 된다.
이처럼 label 은 <filter>, <match> 지시자등을 그룹화 할 수 있다.
@ERROR label
@ERROR label 은 플러그인의 emit_error_event API 에 의해 생성된 오류 레코드에 사용되는 내장 label 이다.
<label @ERROR> 를 설정하면 관련된 오류가 발생했을 때 이벤트가 이 label 로 라우팅 된다. (예: 버퍼가 가득 찼거나 유효하지 않은 레코드일 때)
6. @include
@include 지시자를 사용하여 별도의 설정 파일에 있는 지시자를 가져올 수 있다.
# Include config files in the ./config.d directory
@include config.d/*.conf
|
cs |
@include 지시자는 정규 파일, glob 패턴 및 http URL 규칙 등으로 경로를 지정할 수 있다.
# absolute path
@include /path/to/config.conf
# if using a relative path, the directive will use
# the dirname of this config file to expand the path
@include extra.conf
# glob match pattern
@include config.d/*.conf
# http
@include http://example.com/fluent.conf
|
cs |
glob 패턴에서 파일은 알파벳순으로 불려지므로, a.conf 와 b.conf 가 있으면 fluentd 는 a.conf 를 먼저 분석한다.
중요한 설정 파일은 안전하게 @include 로 따로 구분하라.
# If you have a.conf,b.conf,…,z.conf and a.conf / z.conf are important…
# This is bad
@include *.conf
# This is good
@include a.conf
@include config.d/*.conf
@include z.conf
|
cs |