탕구리's 블로그

fluentd 설정하기 (with docker) 본문

devOps

fluentd 설정하기 (with docker)

탕구리당 2020. 11. 1. 01:59
반응형

fluentd Docker image 생성

  • 알파인 기반의 이미지는 플러그인 설치가 불가능
  • 데비안 기반의 이미지에 커스텀 도커라이징 진행
  • 이미지에 설치한 플러그인 리스트
    • elasticsearch
    • output-http
    • mysql-bulk

 

Dockerfile

FROM fluent/fluentd:v1.11-debian-1

   

# Use root account to use apt

USER root

 

# below RUN includes plugin as examples elasticsearch is not required

# you may customize including plugins as you wish

RUN buildDeps="sudo make gcc g++ libc-dev" \

 && apt-get update \

 && apt-get install -y --no-install-recommends $buildDeps \

 && sudo apt-get install -y libmariadb-dev \

 && sudo gem install fluent-plugin-elasticsearch \

 && sudo gem install fluent-plugin-out-http -v 0.1.4 \

 && sudo gem install fluent-plugin-mysql-bulk \

 && sudo gem sources --clear-all \

 && SUDO_FORCE_REMOVE=yes \

    apt-get purge -y --auto-remove \

                  -o APT::AutoRemove::RecommendsImportant=false \

                  $buildDeps \

 && rm -rf /var/lib/apt/lists/* \

 && rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

 

#COPY ./config/fluent.conf /fluentd/etc/fluent.conf

#COPY ./entrypoint.sh /bin/entrypoint.sh

 

USER fluent

 

fluentd 실행 명령어

docker-run

docker container run \

-u root \

-p 24224:24224 \

-v /home/ec2-user/fluentd/conf/fluent.conf:/fluentd/etc/fluent.conf \

-v /home/ec2-user/logs/:/fluentd/log/ \

--name fluentd  \

accs/fluentd:latest


fluent.conf

Dockerfile

## http call 요청 받기

<source>

  @type  http

  port  24224

</source>

 

## 로그 파일 읽어오기

<source>

  @type tail

  path /fluentd/log/test.log

  pos_file /fluentd/log/test.log.pos

  tag mysql.input

  <parse>

     @type json

  </parse>

</source>

 

 

## nginx 로그 파싱

<source>

  @type tail

  path /fluentd/log/nginx/access.log

  pos_file /fluentd/log/nginx/access.pos.log

  tag nginx.log

  <parse>

    @type nginx

  </parse>

</source>

 

## apache 로그 파싱

<source>

  @type tail

  path /fluentd/log/apache/access.log

  pos_file /fluentd/log/apache/access.pos.log

  tag apache.log

  <parse>

    @type nginx

  </parse>

</source>

 

## regex 기반 로그 파싱

<source>

  @type regexp

  path /fluentd/log/test/access.log

  pos_file /fluentd/log/test/access.pos.log

  tag test.log

  <parse>

    @type regexp

    expression /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)"(?:\s+(?<http_x_forwarded_for>[^ ]+))?)?$/

  </parse>

</source>

 

## match 결과에 따른 output 발생

<match mysql.input>

  @type mysql_bulk

  host 172.31.19.253

  database test_scheme

  username root

  password root

  column_names id,data

  table test

  flush_interval 10s

</match>

 

<match platform.log>

  @type http

  endpoint_url http://172.31.19.253/

  serializer json

</match>

 

 

<match es.log>

 @type elasticsearch

 host 15.165.132.138

 port 9200

 index_name ${tag}

 flush_interval

</match>


수정 필요한 부분

  • 컨테이너 내부에서 파일 실행시 현재 root 권한으로 실행 중
  • 파일에 대한 권한 발급 후 컨테이너 내부 명령 진행하면 좋을 듯

 

Parser type

third party type

  • multi-format-parser
  • grok

 

테스트 진행 사항

  • mysql bulk insert 
    • 특정 주기에 따라 파일을 읽어올 수 있음
    • 한번 읽어온 파일에 대한 position을 따로 관리하여 중복된 데이터는 서치하지 않음
  • http call
    • http를 통한 로그 전송 시 원하는 endpoint로 전달 가능
  • file read
    • 파일을 읽고 out을 생성하는 작업 진행 완료
  • log to elasticsearch 
    • http call을 통해 요청 발생시 index 생성 후 데이터 정상 삽입 여부까지 확인
반응형
Comments