본문 바로가기

인프라,데이터/Fluentd, Fluent Bit

Fluentd로 S3 output path에 field(key) 값 넣기

{"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 에 데이터가 저장됩니다.