인프라,데이터/Fluentd, Fluent Bit
Fluentd로 S3 output path에 field(key) 값 넣기
AimB
2022. 6. 12. 23:23
{"filename":"test.log"} 와 같은 데이터가 있을 때,
Fluentd를 사용해서 "filename" 키의 값에 해당하는 "test.log"를 s3으로 보내는 경로에 넣어주고 싶다면 어떻게 해야 할까요?
먼저 rewrite_tag_filter를 사용해서 필요한 key 값들을 tag에 추가해 줍니다.
<match test.**>
@type rewrite_tag_filter
<rule>
key instance_name
pattern ^(.+)$
tag s3_mid.$1
</rule>
</match>
<match s3_mid.*>
@type rewrite_tag_filter
<rule>
key filename
pattern ^(.+)$
tag s3.${tag}.$1
</rule>
</match>
저는 path에 key를 2개 넣어야 해서 필터를 2번 사용해 줬습니다.
처음엔 한 번에 2개의 rule을 사용하면 안 될까? 했는데 안 됩니다.
# 작동 안 되는 예시
<match test.**>
@type rewrite_tag_filter
<rule>
key instance_name
pattern ^(.+)$
tag s3_mid.$1
</rule>
<rule>
key filename
pattern ^(.+)$
tag s3.${tag}.$1
</rule>
</match>
test.** tag의 값들이 instance_name 키 값을 추가하면서 s3_mid.filename 태그로 바뀌는데,
애초에 해당 필터는 test.**의 값만 받아서 tag를 변경하기 때문에
여기다가 rule을 한번 더 추가한다고 한들 제대로 라우팅이 되지 않습니다.
그렇다고 match에 <match test.** s3_mid.*> 을 넣으면... 무한 반복에 빠집니다....
무튼 처음 코드대로 필터를 필요한 만큼 써서 태그를 만들고,
s3에는 다음과 같이 넣을 수 있습니다.
<match s3.**>
@type s3
s3_bucket test-bucket
s3_region ap-northeast-2
path test/${tag[2]}/${tag[3]}.${tag[4]}/year=%Y/month=%m/day=%d/
<buffer tag, time>
@type file
path /home/test/tmp/fluentd
timekey 1800 # 30m
timekey_wait 10m # 같은 log chunk의 딜레이되는 로그 라인이 유실되지 않도록
</buffer>
<format>
@type json
</format>
</match>
tag.one.two.three.log가 태그 값이라면,
test-bucket/test/two/three.log/year=2022/month=06/day=12 에 데이터가 저장됩니다.