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
</source >
<match app>
type copy
<store>
type file
append true
path /fluentd/log /app
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y-%m-%dT%H:%M:%S %z
compress gzip
</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' ,
transports: [new fluentTransport('app' , {
host: '10.10.10.11' ,
port: 24224 ,
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을 요즘은 더 선호하는듯하다.