본문 바로가기
데브옵스

AWS EC2에 Fluentd 설치하기

by __Minnie_ 2024. 11. 1.
# ec2 사양
AMI: Amazon Linux release 2023.5.20240624 (Amazon Linux)
인스턴스 유형: t2.small

 

1. Fluentd 설치

curl -fsSL https://toolbelt.treasuredata.com/sh/install-amazon2023-fluent-package5-lts.sh | sh

fluentd를 설치하는 shell script를 다운로드 받고 실행시킵니다. 링크를 참조하여 본인의 서버 사양에 맞는 스크립트를 다운로드 받습니다.

cd /usr/lib/systemd/system
ls -al | grep fluent

위 명령어를 실행하면 정상적으로 fluentd가 설치된 것을 확인할 수 있습니다. 설치되고 바로 서비스가 돌지는 않기 때문에 직접 실행시켜주어야 합니다.

 

sudo systemctl status fluentd.service

 

이제 제대로 실행이 되고 있는지 한번 테스트를 해보겠습니다.

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test 
tail -n 1 /var/log/fluent/fluentd.log

위 사진을 보면 http 요청으로 보낸 로그가 fluent에서 인식이 된 것을 확인할 수 있습니다.

그러면 어떻게 위처럼 동작했는지 conf파일을 한번 확인해보겠습니다. 아래는 fluent를 설치하면 기본으로 생성되는 conf파일에서 주석처리된 부분을 제외한 conf파일입니다. (conf파일 기본 경로: /etc/fluent/fluentd.conf)

<match td.*.*>

  @type tdlog

  @id output_td

  apikey YOUR_API_KEY



  auto_create_table

  <buffer>

    @type file

    path /var/log/fluent/buffer/td

  </buffer>



  <secondary>

    @type secondary_file

    directory /var/log/fluent/failed_records

  </secondary>

</match>



<match debug.**>

  @type stdout

  @id output_stdout

</match>


<source>

  @type forward

  @id input_forward

</source>


<source>

  @type http

  @id input_http

  port 8888

</source>


<source>

  @type debug_agent

  @id input_debug_agent

  bind 127.0.0.1

  port 24230

</source>

 

위 conf파일에서 아래와 같은 부분이 있습니다. source는 로그를 어디서 받아올지는 결정하는 부분입니다. @type은 http로 설정되어 있기 때문에 http를 통해서 로그를 수집하고, port는 8888번을 사용합니다. 그래서 우리는 http://localhost:8888/debug.test 으로 요청을 보낸 것입니다. 여기서 debug.test는 태그의 이름입니다. 

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

 

또한 아래 부분의 의미는 debug.**라는 태그를 가진 로그가 인풋되면 표준출력을 하라는 의미입니다. 

<match debug.**>
  @type stdout
  @id output_stdout
</match>

 

그래서 우리가 curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test 으로 요청을 보냈을 때, fluentd 로그에 출력이 되었던 것입니다.

 

2. Fluentd 설정

그러면, 이제 conf파일을 수정하여 nginx의 로그를 수집하고 출력하도록 설정을 변경해보겠습니다. source는 type을 tail로 설정하여 파일에서 로그를 읽어올 수 있도록 하였습니다. path에는 nginx의 기본 로그 경로를 설정해주었고, pos_file은 access.log와 동일한 경로로 세팅해주었습니다(pos_file는 로그파일을 어디까지 읽었는지에 대한 정보를 저장하기 위한 파일입니다. 해당 파일이 없으면 프로그램 재시작시 로그 중복이 발생할 수 있습니다. ). parse는 nginx플러인을 사용하였습니다. parse에 nginx플러그인을 사용하면 nginx의 로그의 형식에 맞도록 파싱을 해줍니다. 그리고 nginx.log라는 태그를 설정하여 출력하도록 합니다. 

<source>
  @type tail
  tag nginx.log
  path /var/log/nginx/access.log
  pos_file /var/log/nginx/access.log.pos
  <parse>
    @type nginx
  </parse>
</source>

<match nginx.log>
  @type stdout
</match>

 

 

설정 파일을 작성한 후 아래 명령어를 사용하면 해당 conf파일의 문법을 확인할 수 있습니다. 

fluentd --dry-run -c ./fluentd.conf

 

이렇게 작성 후 서비스를 재시작하고 fluentd의 로그를 출력해보면

sudo systemctl restart fluentd.service
tail -n 1 /var/log/fluent/fluentd.log

위처럼 로그가 파싱되어 출력되는 것을 확인할 수 있습니다.

 

*참고 (원래 nginx 로그 형식)

 

 

다음 글에서는 Fluentd를 활용해서 S3로 로그를 올리는 포스팅을 가져와보겠습니다.