Fluentd(td-agent) output plugin
테스트 목적
이 문서는 Fluentd의 학습 차원에서 다음과 같은 테스트 케이스 별 단순 동작 확인에 목적을 두고 있다.
-
로그 파일을 읽고 표준 출력하기
-
로그 파일을 읽고 파일로 출력하기
-
로그 파일을 읽고 Elasticsearch에 Insert하기
-
로그 파일을 읽고 Amazone S3에 저장하기
테스트 환경
다음과 같은 환경에서 테스트 하였다.
-
OS : macOS Mojave 10.14.5
-
Fluentd : 1.0.2 (td-agent : 3.1.1.0)
테스트에 필요한 사전정보
Fluentd 기초 사용법을 확인하여 td-agent 기초 동작을 확인하면 된다.
테스트 케이스 : 로그 파일을 읽고 표준 출력하기
테스트 목적
td-agent가 다음과 같은 의도대로 동작 하는지 확인한다.
- 파일의 로그를 읽고 표준 출력하기
테스트 과정
-
입력용 파일을 생성한다.
$ touch file_to_stdout_test.log
파일이 정상적으로 생성되었는지 확인한다.
$ ls -l file_to_stdout_test.log drwxr-xr-x 4 kevin staff 0 8 6 16:52 file_to_stdout_test.log
-
td-agent.conf 파일을 다음과 같이 수정한다.
$ vim /etc/td-agent/td-agent.conf <source> @type tail path /Users/kevin/dev/fluentd/test/file_to_stdout/source/file_to_stdout_test.log pos_file /home/kevin/dev/fluentd/test/pos_file/file_to_stdout.pos tag file_to_stdout.test <parse> @type none </parse> </source> <match file_to_stdout.*> @type stdout </match>
tail, stdout은 default plugin으로 별도의 plugin 설치가 필요하지 않다.
-
source
-
path : 읽어오고자 하는 로그 파일의 경로를 지정하는 parameter로 wildcard(*)를 사용하여 디렉터리를 지정할 수도 있다.
-
pos_file : td-agent는 입력용 로그 파일에 접근하여 읽었던 위치를 파일로 저장한다. 그 파일의 경로를 지정하는 parameter이다.
-
parse : 로그 파일 포맷을 의미한다. none은 라인 단위 구문 분석을 의미한다.
-
tag : 이벤트를 구분짓기 위한 tag name을 의미한다.
-
-
match
-
: tag명에 대한 이벤트를 출력하겠다는 의미이다.
-
설정에 관하여 더 자세한 내용은 아래의 링크를 통하여 확인할 수 있다.
이제 td-agent를 한다.
-
-
파일에 다음과 같은 로그를 저장하고 이를 확인한다.
$ vim file_to_stdout_test.log file_to_stdout_test 1 file_to_stdout_test 2 file_to_stdout_test 3 file_to_stdout_test 4 file_to_stdout_test 5
td-agent의 표준 출력을 확인한다.
$ tail -5f /var/log/td-agent/td-agent.log 2019-08-06 20:30:20.191939654 +0900 file_to_stdout.test: {"message":"file_to_stdout_test 1"} 2019-08-06 20:30:25.738923745 +0900 file_to_stdout.test: {"message":"file_to_stdout_test 2"} 2019-08-06 20:30:31.243424029 +0900 file_to_stdout.test: {"message":"file_to_stdout_test 3"} 2019-08-06 20:30:35.698592603 +0900 file_to_stdout.test: {"message":"file_to_stdout_test 4"} 2019-08-06 20:30:40.123402487 +0900 file_to_stdout.test: {"message":"file_to_stdout_test 5"}
테스트 결과
파일에 저장된 로그는 라인 단위로 읽어와 “로그를 수집한 날짜”, “이벤트 Tag명”, “로그”를 표준출력하며 형식은 다음과 같음을 알 수 있다.
(로그를 수집한 날짜) (이벤트 Tag명): {"message":"(로그)"}
테스트 케이스 : 로그 파일을 읽고 파일로 출력하기
테스트 목적
td-agent가 다음과 같은 의도대로 동작 하는지 확인한다.
- 디렉터리내 파일들의 로그를 읽고 파일 출력하기(출력 파일의 파일명 양식지정)
테스트 과정
-
입력용 파일을 생성한다.
$ touch file_to_file_01.log file_to_file_02.log file_to_file_03.log
파일이 정상적으로 생성되었는지 확인한다.
$ ls -l file_to_file_0*.log -rw-r--r-- 1 kevin staff 0 8 13 21:09 file_to_file_01.log -rw-r--r-- 1 kevin staff 0 8 13 21:09 file_to_file_02.log -rw-r--r-- 1 kevin staff 0 8 13 21:09 file_to_file_03.log
-
td-agent.conf 파일을 다음과 같이 수정한다.
$ vim /etc/td-agent/td-agent.conf <source> @type tail path /Users/kevin/dev/fluentd/test/file_to_file/source/* pos_file /Users/kevin/dev/fluentd/test/pos/file_to_file.pos tag file_to_file.test <parse> @type none </parse> refresh_interval 1s </source> <match file_to_file.*> @type file path /Users/kevin/dev/fluentd/test/file_to_file/match/${tag} <buffer tag> flush_mode interval flush_interval 10s </buffer> </match>
tail, file은 default plugin으로 별도의 plugin 설치가 필요하지 않다.
-
source
-
path : 읽어오고자 하는 로그 파일의 경로를 지정하는 parameter로 wildcard(*)를 사용하여 디렉터리를 지정할 수도 있다. 디렉터리를 지정하기 위하여 wildcard(*)로 지정한다.
-
pos_file : td-agent는 입력용 로그 파일에 접근하여 읽었던 위치를 파일로 저장한다. 그 파일의 경로를 지정하는 parameter이다.
-
parse : 로그 파일 포맷을 의미한다. none은 라인 단위 구문 분석을 의미한다.
-
tag : 이벤트를 구분짓기 위한 tag name을 의미한다.
-
refresh_interval : td-agent가 수집하려는 파일리스트의 갱신주기를 의미한다.
-
-
match
-
: tag명에 대한 이벤트를 출력하겠다는 의미이다. - path : 저장할 경로를 지정한다. 예약어 tag를 사용한다.
-
-
buffer
-
: 예약어에 대한 필터를 지정한다. -
flush_mode : flush의 mode를 설정한다.(lazy, interval, immediate)
- flush_interval : flush_mode가 interval일 경우에만 지정하며, flush의 주기를 설정한다.
-
더 자세한 내용은 아래의 링크를 통하여 확인한다.
이제 td-agent를 실행한다.
-
-
입력용 로그 파일 1개에 다음과 같이 로그를 출력한다.
$ vim file_to_file_01.log file_to_file_01 line 1 file_to_file_01 line 2 file_to_file_01 line 3 file_to_file_01 line 4 file_to_file_01 line 5
출력용 파일을 확인한다.
$ cat file_to_file.test_0.log 2019-08-13T21:58:56+09:00 file_to_file.test {"message":"file_to_file_01 line 1"} 2019-08-13T21:58:56+09:00 file_to_file.test {"message":"file_to_file_01 line 2"} 2019-08-13T21:58:56+09:00 file_to_file.test {"message":"file_to_file_01 line 3"} 2019-08-13T21:58:56+09:00 file_to_file.test {"message":"file_to_file_01 line 4"} 2019-08-13T21:58:56+09:00 file_to_file.test {"message":"file_to_file_01 line 5"}
파일명은 ${tag]_${index}.log형태로 출력된다.
만약 ${tag}.log형태로 출력하려면 다음과 같이 match의 append 옵션을 수정하면 된다.
<match 이벤트 tag명> ...중략... append true ...중략... <match>
나머지 파일에도 로그를 출력한다.
$ vim file_to_file_02.log file_to_file_02 line 1 file_to_file_02 line 2 file_to_file_02 line 3 file_to_file_02 line 4 file_to_file_02 line 5
$ vim file_to_file_03.log file_to_file_03 line 1 file_to_file_03 line 2 file_to_file_03 line 3 file_to_file_03 line 4 file_to_file_03 line 5
출력용 파일을 확인한다.
$ cat file_to_file.test_1.log 2019-08-13T22:07:06+09:00 file_to_file.test {"message":"file_to_file_02 line 1"} 2019-08-13T22:07:06+09:00 file_to_file.test {"message":"file_to_file_02 line 2"} 2019-08-13T22:07:06+09:00 file_to_file.test {"message":"file_to_file_02 line 3"} 2019-08-13T22:07:06+09:00 file_to_file.test {"message":"file_to_file_02 line 4"} 2019-08-13T22:07:06+09:00 file_to_file.test {"message":"file_to_file_02 line 5"} 2019-08-13T22:07:17+09:00 file_to_file.test {"message":"file_to_file_03 line 1"} 2019-08-13T22:07:17+09:00 file_to_file.test {"message":"file_to_file_03 line 2"} 2019-08-13T22:07:17+09:00 file_to_file.test {"message":"file_to_file_03 line 3"} 2019-08-13T22:07:17+09:00 file_to_file.test {"message":"file_to_file_03 line 4"} 2019-08-13T22:07:17+09:00 file_to_file.test {"message":"file_to_file_03 line 5"}
테스트 결과
테스트 결과는 다음과 같다.
-
입력용 파일에 저장된 로그는 라인 단위로 읽어와 “로그를 수집한 날짜”, “이벤트 Tag명”, “로그”를 파일로 출력하며 형식은 다음과 같다.
(로그를 수집한 날짜) (이벤트 Tag명) {"message":"(로그)"}
-
디렉터리내 여러개 파일의 로그가 파일로 출력된다.
-
파일명 양식을 설정하면 다음과 같은 형태로 출력된다.
파일명양식_{index}.log
테스트 케이스 : 로그 파일을 읽고 Elasticsearch에 Insert하기
테스트 목적
td-agent가 다음과 같은 의도대로 동작하는지 확인한다.
- 파일의 json 로그를 읽고 elasticsearch에 insert하기
테스트 환경 추가 구성
이 테스트를 위하여 다음과 같은 아키텍쳐를 추가 구성해야한다.
Elasticsearch 6.7.1
테스트 과정
-
입력용 파일을 생성한다.
$ touch json_file_to_es_test.log
파일이 정상적으로 생성되었는지 확인한다.
$ ls -l total 0 -rw-r--r-- 1 kevin staff 0 8 13 13:48 json_file_to_es.log
-
td-agent.conf 파일을 다음과 같이 수정한다.
$ vim /etc/td-agent/td-agent.conf <source> @type tail path /Users/kevin/dev/fluentd/test/json_file_to_es/source/** pos_file /Users/kevin/dev/fluentd/test/pos/json_file_to_es.pos tag json_file_to_es.test <parse> @type json </parse> </source> <match json_file_to_es.**> @type elasticsearch host localhost port 9200 index_name json_file_to_es type_name _doc </match>
tail은 default plugin으로 별도의 plugin설치가 필요하지 않다.
es는 td-agent v3.0.1 이상부터 default plugin이다. 따라서 테스트 환경(td-agent v3.1.1.0)에서는 별도의 plugin 설치가 필요하지 않다.
-
source
-
path : 읽어오고자 하는 로그 파일의 경로를 지정하는 parameter로 wildcard(*)를 사용하여 디렉터리를 지정할 수도 있다.
-
pos_file : td-agent는 입력용 로그 파일에 접근하여 읽었던 위치를 파일로 저장한다. 그 파일의 경로를 지정하는 parameter이다.
-
parse : 로그 파일 포맷을 의미한다. json은 라인 별로 json으로 파싱한다는 의미한다.
-
tag : 이벤트를 구분짓기 위한 tag name을 의미한다.
-
-
match
-
: tag명에 대한 이벤트를 출력하겠다는 의미이다. -
host : 로그를 출력할 elasticsearch의 host를 의미한다.
-
port: 로그를 출력할 elasticsearch의 port를 의미한다.
-
index_name : 로그를 출력할 elasticsearch index의 이름을 지정한다.
- type_name : 로그를 출력할 elasticsearch index의 type을 의미하며 별도로 지정하지 않는다면 elasticsearch v6.7.1 기준 _doc type에 저장된다.
-
더 자세한 내용은 아래의 링크를 통하여 확인한다.
이제 td-agent를 실행한다.
-
-
elasticsearch는 local 환경에서 구동하기 때문에 다음의 설정을 확인한다.
port 확인(default : 9200)
elasticsearch를 실행한다.
$ ./bin/elasticsearch
elasticsearch가 구동되는지 확인한다.
$ curl -X GET "localhost:9200" { "name" : "kevin_es_node_name", "cluster_name" : "kevin_es_cluster_name", "cluster_uuid" : "G_WJqbiFS7Srdm4S1mUKWA", "version" : { "number" : "6.7.1", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "2f32220", "build_date" : "2019-04-02T15:59:27.961366Z", "build_snapshot" : false, "lucene_version" : "7.7.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
elasticsearch에 index가 생성되고 document가 추가되는지 확인하기 위하여 document를 추가한다.
$ curl -H 'Content-Type: application/json' -XPOST localhost:9200/json_file_to_es/_doc/1/ -d '{"file_name" : "creat_index_add_document", "tag_name" : "test", "lines" : 1}' {"_index":"json_file_to_es","_type":"_doc","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}%
정상적으로 document가 추가 되었는지 확인한다.
$ curl -XGET 'localhost:9200/json_file_to_es/_search?pretty' { "took" : 0, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.0, "hits" : [ { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "file_name" : "creat_index_add_document", "tag_name" : "test", "lines" : 1 } } ] } }
정상적으로 document가 추가된 것을 확인하였으면 테스트 진행을 위하여 index를 삭제한다.
$ curl -XDELETE 'localhost:9200/json_file_to_es?pretty' { "acknowledged" : true }
-
입력용 로그파일에 로그를 출력한다.
$ vim json_file_to_es.log { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 1 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 2 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 3 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 4 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 5 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 6 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 7 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 8 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 9 } { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 10 }
elasticsearch에 index에 정상적으로 insert 되었는지 확인한다.
$ curl -X GET 'localhost:9200/json_file_to_es/_search?filter_path=hits&pretty' { "hits" : { "total" : 10, "max_score" : 1.0, "hits" : [ { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "boabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 2 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "cYabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 5 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "dYabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 9 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "doabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 10 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "coabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 6 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "dIabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 8 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "bYabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 1 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "b4abimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 3 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "cIabimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 4 } }, { "_index" : "json_file_to_es", "_type" : "_doc", "_id" : "c4abimwBFFtJqSTvn084", "_score" : 1.0, "_source" : { "file_name" : "json_file_to_es", "tag_name" : "json_file_to_es", "lines" : 7 } } ] } }
테스트 결과
테스트 결과는 다음과 같다.
-
입력용 파일에 로그를 라인 단위로 읽고 json으로 파싱한다.
-
파싱한 로그는 Elasticsearch index에 Insert 된다.
테스트 케이스 : 로그 파일을 읽고 Amazon S3에 저장하기
테스트 목적
td-agent가 다음과 같은 의도대로 동작 하는지 확인한다.
-
파일의 로그를 읽고 Amazon S3 저장하기
-
Amazone S3 저장하기 전, 미리 설정한 경로에 임시저장 여부
-
Amazone S3 저장할 때, 미리 설정한 경로와 파일명 양식에 맞추어 저장여부
-
테스트 과정
-
입력용으로 사용할 로그 파일 생성한다.
$ touch source.log
파일이 정상적으로 생성 되었는지 확인한다.
$ ls -l total 0 -rw-r--r-- 1 kevin staff 0 8 9 15:00 source.log
-
td-agent 파일은 다음과 같이 수정한다.
$ vim /etc/td-agent/td-agent.conf <source> @type tail path /Users/kevin/dev/fluentd/test/file_to_s3/source/* pos_file /Users/kevin/dev/fluentd/test/pos/file_to_s3.pos tag file_to_s3.test <parse> @type none </parse> refresh_interval 1s </source> <match file_to_s3.*> @type s3 aws_key_id ### access key id를 입력 aws_sec_key ### access secret key를 입력 s3_bucket ### s3_bucket s3_region ### s3_region store_as text path fluentd-raw-test s3_object_key_format %{path}/${tag}_%{index}.log <buffer tag> @type file path /Users/kevin/dev/fluentd/test/file_to_s3/match flush_mode interval flush_interval 50s </buffer> </match>
tail은 default plugin으로 별도의 plugin 설치가 필요하지 않다.
s3는 테스트 환경(td-agent v3.1.1)에서는 별도의 plugin 설치가 필요하지 않다.
-
source
-
path : 읽어오고자 하는 로그 파일의 경로를 지정하는 parameter로 wildcard(*)를 사용하여 디렉터리를 지정할 수도 있다. 편의상 파일명을 지정하지 않고 wildcard를 사용한다.
-
pos_file : td-agent는 입력용 로그 파일에 접근하여 읽었던 위치를 파일로 저장한다. 그 파일의 경로를 지정하는 parameter이다.
-
parse : 로그 파일 포맷을 의미한다. none은 라인 단위 구문 분석을 의미한다.
-
tag : 이벤트를 구분짓기 위한 tag name을 의미한다.
-
refresh_interval : td-agent가 수집하려는 파일리스트의 갱신주기를 의미한다.
-
-
match
-
: tag명에 대한 이벤트를 출력하겠다는 의미이다. -
aws_key_id : AWS access key id를 입력한다.
-
aws_sec_key : AWS secret key를 입력한다.
-
s3_bucket : bucket 이름을 지정한다.
-
s3_region : region을 입력한다.
-
store_as : 저장할 파일 포맷을 지정한다.
-
path : bucket 하위의 저장되는 경로를 지정한다.
- s3_object_key_format : 파일의 저장하는 양식을 지정한다.
-
-
buffer
-
: 예약어에 대한 필터를 지정한다. -
path : 임시 저장 파일의 경로를 지정한다.
-
flush_mode : flush의 mode를 설정한다.(lazy, interval, immediate)
- flush_interval : flush_mode가 interval일 경우에만 지정하며, flush의 주기를 설정한다.
-
더 자세한 내용은 아래의 링크를 통하여 확인한다.
이제 td-agent를 실행한다.
-
-
입력 로그 파일에 로그를 출력한다.
$ vim source.log ./source/source.log - Loop seq 1 ./source/source.log - Loop seq 2 ./source/source.log - Loop seq 3 ... 중략 ... ./source/source.log - Loop seq 98 ./source/source.log - Loop seq 99 ./source/source.log - Loop seq 100
-
미리 설정한 임시 저장 경로에 파일이 생성되는지 확인한다.
$ ls -al total 32 drwxr-xr-x 4 kevin staff 128 8 12 21:49 . drwxr-xr-x 6 kevin staff 192 8 9 17:04 .. -rw-r--r-- 1 root staff 8992 8 12 21:49 buffer.b58feaf4165048e338efa067db3a22de5.log -rw-r--r-- 1 root staff 79 8 12 21:49 buffer.b58feaf4165048e338efa067db3a22de5.log.meta
입력 파일에 로그 출력후 flush_interval 시간이 지나기 전에 확인해야한다.
파일에 접근하여 내용을 확인한다.
$ cat *.log 2019-08-12T21:49:23+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 1"} 2019-08-12T21:49:23+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 2"} ...중략... 2019-08-12T21:49:23+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 98"} 2019-08-12T21:49:23+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 99"} 2019-08-12T21:49:23+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 100"}
-
Amazon S3 페이지에서 파일이 설정한 경로와 파일명 양식으로 저장되었는지 확인한다.
해당 파일을 다운로드하여 정상적으로 출력되었는 지 확인한다.
$ cat file_to_s3.test_0.txt 2019-08-09T19:15:22+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 1"} 2019-08-09T19:15:22+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 2"} ... 중략 ... 2019-08-09T19:15:22+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 99"} 2019-08-09T19:15:22+09:00 file_to_s3.test {"message":"./source/source.log - Loop seq 100"}
테스트 결과
테스트 결과는 다음과 같다.
-
입력용 파일에 저장된 로그는 라인 단위로 읽어와 “로그를 수집한 날짜”, “이벤트Tag명”, “로그”를 파일로 출력하며 형식은 다음과 같다.
(로그를 수집한 날짜) (이벤트 Tag명) {"message":"(로그)"}
-
Amazone S3에 저장하기 전, 미리 설정한 경로에 파일을 생성하여 임시 저장하게 할 수 있다.
-
Amazone S3 저장시 미리 설정한 경로와 파일명 양식에 맞추어 저장할 수 있다.
댓글남기기