fluentd

fluentd

이전 포스트 build docker service with jenkins 에서 jenkins를 활용하여 docker swarm build를 하는 방법에 대해서 알아보았다.
n 개의 node에서 분산되어있는 service container에 쌓이는 log를 한곳으로 취합할수있는 방법이 없을까 찾아보다가 fluentd를 만나게되었다.
참고로, docker swarm service 에서 shell 상에서 실시간 log를 확인하려면 다음의 명령어를 사용하면된다.

1
$ docker service logs -f --raw setyourmindpark_service_backend

이번 포스트에서는 fluentd를 사용하여 log를 어떻게 취합하는지 알아보자.

setup fluentd

fluentd 공식 사이트에서 https://docs.fluentd.org/v0.12/categories/installation os환경에따라 설치를 진행할수있다.
필자는 역시 docker 기반으로 사용할것이기에 https://docs.fluentd.org/v0.12/articles/install-by-docker fluentd docker official image로 진행하였다. 설정은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ vi ~/fluentd/volume/config/fluentd.conf
<source>
type forward
port 24224 # listening port
</source>
<match app> # tag name
type copy
<store>
type file
append true
path /fluentd/log/app # to store log path
time_slice_format %Y%m%d # log file format
time_slice_wait 10m
time_format %Y-%m-%dT%H:%M:%S %z # log time format
compress gzip # compress format # file will create at 00:00 everyday
#utc # if do not use utc log time format, defailt local timezone
</store>
</match>

1
2
3
4
5
6
7
8
$ docker run -d --name fluentd \
-p 24224:24224 \
-v ~/fluentd/volume/config:/fluentd/etc \
-v ~/fluentd/volume/plugins:/fluentd/plugins \
-v ~/fluentd/volume/log:/fluentd/log \
-e FLUENTD_CONF=fluentd.conf \
-e TZ=Asia/Seoul \
fluent/fluentd:v0.12-debian

이제 fluentd에 log를 날려보자.

dependencies ( nodejs )

nodejs module중 고맙게도 fluentd에 관련된 dependency를 제공한다.

필자는 winston module과 fluent-logger modeul을 같이 사용하였다. 설정은 다음과같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const winston = require('winston');
const fluentTransport = require('fluent-logger').support.winstonTransport();
const logger = new (winston.Logger)({
level : 'debug', // error: 0, warn: 1, info: 2, verbose: 3, debug: 4, silly: 5
transports: [new fluentTransport('app', { // tag name
host: '10.10.10.11', // host
port: 24224, // port
timeout: 3.0
}), new (winston.transports.Console)({
colorize : true
})]
});
logger.debug('debug log');
logger.info('info log');
logger.error('error log');

fluentd에 log 가 제대로 들어왔는지 확인해보자.

1
2
3
4
5
6
7
$ cd ~/fluentd/volume/log
$ ls
app.20180226.b566194875a717ee6
$ cat app.20180226.b566194875a717ee6
2018-02-26T18:17:09 +0900 app {"level":"debug","message":"debug log","meta":{}}
2018-02-26T18:17:09 +0900 app {"level":"info","message":"info log","meta":{}}
2018-02-26T18:17:09 +0900 app {"level":"error","message":"error log","meta":{}}

참고

fluentd를 사용하여 file system에 log를 취합하는 방법을 알아보았다.
fluentd는 이와 관련하여 file system뿐만아니라 db에도 trigging 할수도있다.
https://docs.fluentd.org/v0.12/articles/out_copy
그밖에도 지원되는 plugin이 굉장히 많으므로 구성하고자 하는 환경에따라 plugin을 사용하면될듯하다. ( 공부해야겠다….. )
또한 elastic search 와 관련하여 ELK( elastic search + logstash + kibana )를 대신하여 EFK ( elastic search + fluentd + kibana ) stack을 요즘은 더 선호하는듯하다.