본문 바로가기
Back Side

Fluentd를 이용해 로그 내용에 따라 동적으로 파일명 바꾸기 with.rewrite_tag_filter 플러그인

by developerBeluga 2023. 8. 5.
728x90
반응형

 

 

 

 

 

동적으로 파일명으로 바꾸라고요?

현재 우리 회사 서비스에선 시스템 로그와 사용자 로그 두개를 생성, 관리를 해야한다.

시스템 로그와 우리들이 필요하다고 하지만 사용자 로그의 경우 우리 회사 서비스를 사용하는 사용자들에게 제공할거라 고민이 많았다.

 

가장 큰 고민은 그 많은 로그를 사용자 id를 따라서 다르게 보여주는 거였다.

그때 나온 의견은 사용자 id가 파일명이 해결할 수 있다는 거였다.

흐음 일리가 있어서 바로 fluentd의 파일명으로 동적으로 바꾸기를 시작했다.

아래는 그에 따른 개발 일대기다.

 

 

첫번째 시도 - 태그로 해결해보자

우선 다른 플러그인을 사용하기 전에 기본적인 fluentd로 해결할 수 있나 고민해봤다 🤔

그때 든 생각은 javascript의 템플릿 리터럴이다.

대체로 백틱에 달러를 사용하면 동적으로 데이터를 바꿀 수 있다.

 

https://docs.fluentd.org/filter/record_transformer

찾아본 결과 fluentd에서 ${}를 이용할 수 있었다.

정확히는 record_transformer의 record을 이용해 내부의 매개변수를 만들 수 있다.

 

 

  <filter kubernetes.**>
    @type record_transformer
    enable_ruby
    <record>
      my_tag ${record['message'].split(' ')[3].split('/')[0]}
    </record>
  </filter>

  <match **>
    @type file
    path /fluentd/log/${my_tag}
    append true
    <buffer tag>
      path /fluentd/log/buffer/${my_tag}.*.buffer
      chunk_limit_size 2m
      flush_mode interval
      flush_interval 10s
    </buffer>
    <format>
      @type json
    </format>
  </match>

자 이렇게 할 경우 내가 원하는 건 my_tag에서 추출한 64c9f0c82b6c24a539815906가 태그로 뽑혀 64c9f0c82b6c24a539815906.log로 출력되는거다.

 

하지만 내가 마주한 것은 error="Parameter 'path: /fluentd/log/${my_tag}.%Y%m%d.log' has placeholders, but chunk keys doesn't have keys my_tag" 라는 오류였다.

 

왜 이럴까?

그 이유는 아직 이벤트 태그를 my_tag 필드 값으로 변경하는 작업이 이루어지지 않았기 때문이다.

fluentd가 버퍼를 파일에 플러시할 때 my_tag 필드 값을 사용해 파일 이름을 만드는 것을 기대한다.

하지만 여전히 이벤트 태그는 원래의 값이고 'my_tag' 필드는 추가된 필드이기 때문이다.

 

즉, 현 fluentd에서는 원하는 방식으로 원하는 결과를 얻을 수 없다!

 

 

 

 

두번째 시도 - rewrite_tag_filter 플러그인 사용하기

도저히 안되는 것인가?

정말 안되는 것일까?

 

현실을 받아 들일 수 없어 동적(dynamically)으로 fluentd 플러그인 리스트를 찾아본 결과 forest가 발견되었다.

좀 더 찾아보다가 단비와 같은 글을 발견했다!

https://qiita.com/yococo/items/8fa81747310e0a61808e

 

Fluentdでプラグインを使うと便利になる - Qiita

概要 以下を使って、データの内容によってファイル名、パスを動的に変えて出力するメモ rewrite_tag_filter file_alternative こんなかんじ↓ 試しにやってみよう 1. 「tag」...

qiita.com

 

딱 내가 원하는 것처럼 로그 내용에 따라 동적으로 파일명으로 바꾸것이었다.

찬찬히 읽어보니 forest 플러그인을 사용하기 전에 rewrite_tag_filter 플러그인을 이용하는 걸 알았다.

 

rewrite_tag_filter는 fluetnd 공식문서에도 있는 플러그인이다.

이 플러그인을 사용하면 이벤트의 태그를 변경할 수 있다.

즉, my_tag라고 설정한 필드의 값을 이벤트의 태그로 변경해주는 작업을 해준다 👍

 

하지만 rewrite_tag_filter는 fluentd 이미지에서 기본적으로 제공해주지 않는다.

혹시 사용할 사람들은 아래 작성한 포스터를 참고하면 좋을 것 같다.

https://bcoding-lab.tistory.com/390

 

Unknown filter plugin 'rewrite_tag_filter'. Run 'gem search -rd fluent-plugin' to find plugins 해결하기

현재 원하는대로 로그를 뽑던 중 동적으로 이름을 로그 파일 제목을 바꾸면 좋겠다고 생각해 개발하고 있었다. 태그를 이용하면 된다는 것을 알고 fluentd의 rewrite_tag_filter 플러그인을 사용하고자

bcoding-lab.tistory.com

 

  <filter kubernetes.**>
    @type record_transformer
    enable_ruby
    <record>
      my_tag ${record['message'].split(' ')[3].split('/')[0]}
    </record>
  </filter>

  <match kubernetes.**>
    @type rewrite_tag_filter
    <rule>
      key my_tag
      pattern /^(.+)$/
      tag $1
    </rule>
  </match>

  <match **>
    @type file
    path /fluentd/log/${tag}
    append true
    <buffer tag>
      path /fluentd/log/buffer/${tag}.*.buffer
      chunk_limit_size 2m
      flush_mode interval
      flush_interval 10s
    </buffer>
    <format>
      @type json
    </format>
  </match>

자 인제 아까 코드에서 rewite_tag_filter를 추가해주자.

여기에서 조심해야하는 점은 path에 ${my_tag}라고 하면 안된다.

rewrite_tag_filter을 통해 my_tag 필드의 값으로 태그를 변경한 것이기 때문에 이벤트의 태그인 ${tag}를 이용하자.

 

그럼 인제 fluentd를 올려주고 실행해본 결과 원하는 것처럼 사용자 id에 따라서 로그 파일이 생겼다.

굳 👍

 

 

 

 

 

 

 

 

728x90
반응형

댓글