Log Aggregation/FluentD

Spring Logback -> FluentD -> ES 연동 - 1.FluentD UI 설치 및 Config 세팅

Camouflage129 2021. 1. 7. 11:23

EKS를 사용하면서, 로그를 어떻게 넘기는 것이 좋을까 고민을 많이하였습니다.

 

Log Stdout을 fluentd ds로 넘기려하다가 각 노드에 ds가 많아지면

 

노드가 하나 생성될 때, 기본적으로 차지하는 리소스 및 IP수 때문에,

 

실 서비스만 구동하여 관리하려던 설계와 방향이 맞지 않았습니다.

 

따라서 Spring Logback에서 부터 FluentD 서버로 FluentD -> ES Service로 시행착오를 거쳐 잘 진행된 부분입니다.

 

관리를 편하게 하기 위해서 UI가 있는 FluentD UI를 설치해보겠습니다.

 

Amazon Linux2에서 아래 쉘을 통해 루비 및 FluentD를 설치해줍니다.

 

sudo amazon-linux-extras install -y epel
sudo amazon-linux-extras install -y ruby2.6
sudo yum install -y gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel patch redhat-rpm-config sqlite-devel
sudo yum install -y gcc gcc-c++ openssl-devel ruby-devel.noarch patch
gem install rdoc
gem install bundle
gem install rails
gem install -V fluentd-ui

 

설치를 완료했다면 아래 명령어를 통해 FluentD를 실행시켜주시고,

aws es service로 던질 수 있도록 플러그인을 설치해줍니다.

 

fluentd-ui start --daemonize
fluent-gem install fluent-plugin-aws-elasticsearch-service

 

이제, localhost:9292 로 접속하여, admin/changeme 로 로그인 한 후 config 파일을 아래와 같이 수정하도록 하겠습니다.

 

 

<source>
  @type forward
  port 24224
  deny_keepalive false
</source>

<source>
  @type http
  port 8888
</source>

<match *.applog>
  @type copy
  <store>
    @type stdout
  </store>
  <store>
    @type "aws-elasticsearch-service"

    logstash_format true
    logstash_prefix ${tag}
    logstash_dateformat %Y%m
    include_timestamp true
    include_tag_key true
    time_key timestamp

    reload_connections false
    reconnect_on_error true
    reload_on_failure true

    flush_interval 1s
    chunk_limit_size 1m
    flush_thread_interval 0.1
    flush_thread_burst_interval 0.01
    flush_thread_count 15
    <endpoint>
      url "https://{your-es-endpoint}.ap-northeast-2.es.amazonaws.com"
      region ap-northeast-2
    </endpoint>
  </store>
</match>

 

대략적으로 설명하면, 24224 포트로 logback에서 connection으로 받겠다는 옵션이며,

해당 커넥션이 keepalive가 되게 해준다는 뜻입니다.

 

만약 true로 할 경우, fluentd가 커넥션을 계속 끊어버리기 때문에

서버쪽에서는 커넥션이 broken되었다거나, refuse되었다는 에러로그가 찍힐 수 있습니다.

 

로그백 설정에서 tag.label으로 로그를 쏠 것인데, 해당 태그값을 가지고 match하여서 stdout을 찍어 debuggin을하고,

es로 tag.label.202101 이러한 index로 던진다는 뜻입니다.

 

<endpoint> 안에서는 사실 assume role을 통해 iam을 매핑해서

ES에서 정해진 Role을 가진 FluentD에서만 데이터를 쏠 수 있도록 추가적인 설정을해주는 것이 좋습니다.

 

이제 다시 대시보드 화면에서 FluentD를 Start해주고, 아래 명령어를 통해 테스트 해보시면 됩니다.

 

curl -X POST -d 'json={"data":"test"}' localhost:8888/test.applog

 

해당 부분이 문제없이 아래와 같이 stdout에 찍히고,

 

 

위와 같이 나왔다면 정상적으로 잘 구동되는 것을 확인하실 수 있습니다.

 

또한 ES에서도 아래와 같이 잘 Index가 생성된 것을 확인할 수 있습니다.

 

 

다음 게시글에서는 Spring Logback 세팅을 해보도록 하겠습니다.