{"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 에 데이터가 저장됩니다.
'인프라,데이터 > Fluentd, Fluent Bit' 카테고리의 다른 글
Kubernetes 환경에서 Fluent Bit의 신뢰성 (tail input, s3 output) (0) | 2022.09.01 |
---|---|
Fluentd tail input 로그 1개 손실 & 로그 느리게 들어오는 이유 해결 (0) | 2022.06.29 |
Fluentd add Record Field by Ruby 'Case when~' Conditional Statements (0) | 2022.06.07 |
argocd 로그 모니터링 (0) | 2022.05.02 |
Fluent Bit에 SQS Output 연결하기(feat. Golang) (0) | 2022.04.14 |