끄적이는 메모장

서버 로그 다루기 - Fluentd 편 본문

인프라 공부/ELK

서버 로그 다루기 - Fluentd 편

밥보92 2021. 3. 27. 14:48
반응형

Fluentd 

- Ruby 기반의 로그 수집기입니다.

- 다양한 Input으로부터 로그를 수집할 수 있고 로그를 Tag로 관리하여 가공과 Output 처리까지 진행 가능합니다.

- kubernetes에서는 로그 수집을 위한 Standard처럼 사용하고 있기도 합니다. 

- www.fluentd.org 공식 사이트에서 다양한 정보를 찾아볼 수 있습니다. 

 

본 글에서는 다양한 Log File에서 로그를 수집하고 이를 가공 및 전송(Output) 하는 방법으로 Fluentd를 다루는 방법을 설명해보려고 합니다. 

 

1. Fluentd 설치 및 설정하기 (fluentd 3 기준, redhat OS 기준)

docs.fluentd.org/installation (기타는 공식 홈페이지 참고)

 

(1) Fluentd 설치해주기 

$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh

(2) Flunetd 실행

a. systemd로 실행 하기 

시작하기
$ sudo systemctl start td-agent.service
멈추기
$ sudo systemctl stop td-agent.service

b. init.d로 실행하기 (centOS 6)

시작하기
$ sudo /etc/init.d/td-agent start
멈추기
$ sudo /etc/init.d/td-agent stop

(3) Fluentd 세부 설정 

- 간혹 Tail로 모니터링하려는 file이 실행 권한보다 위에 있는 경우가 있다. 이러한 경우 Fluentd의 세부 설정을 변경해주어 권한에 모니터링이 영향을 받지 않도록 해준다. 

- /etc/init.d/td-agent 혹은 /lib/systemd/system/td-agent.service 파일을 수정

- TD_AGENT_USER / TD_AGENT_GROUP 두 권한을 모니터링하려는 Log File의 권한과 동일하게 설정 

ex) File의 권한이 root인 경우 

TG_AGENT_GROUP=root
TG_AGENT_USER=root

(4) Fluentd 로그 보기 

- /var/log/td-agent/ 폴더 내에 로그가 위치하며 로그를 보기 위해서 sudo 권한이 필요할 수 있다. 

2. Fluentd 스크립트 만들기 

- Flunetd가 동작하기 위한 규칙을 스크립트로 구성한다. 

- Flunetd는 /etc/td-agent/td-agent.conf 파일에 구성된 규칙에 의해 동작을 수행한다. 

 

(1) Input 받아 오기 

- Fluentd는 다양한 Input으로부터 로그를 수집할 수 있다. 

- 본 글에서는 Tail을 이용하여 File Log로부터 로그를 수집하는 것을 설명한다. 

 

아래 예시를 보면 어느 <source> Tag를 이용하여 Input을 지정하고 있다. 

: @type tail - 저장할 file의 tail을 보면서 로그를 수집하겠다는 것이며, path와 pos_file, tag 등을 필수로 함께 작성해주어야 한다. 

: path - 로그를 수집할 file의 위치를 지정한다. 예시처럼 파일을 명시적으로 한 개 지정할 수 도 있고 wildcard 문자로 특정 폴더 내의 모든 파일 등을 지정할 수 도 있다. (/myserver/log/*) 

* 단, wildcard 문자로 복수개의 파일을 지정하는 경우 주의할 점이 있다. tail은 모니터링할 파일을 등록하면 그 파일에 대한 지속적인 모니터링을 하게 된다. 따라서, 계속 파일 개수가 늘어나는 경우 서버 장비를 td-agent가 과도하게 점유하는 일이 생긴다. 

* 올바르게 tail을 통한 file log 모니터링을 하려면 하나의 파일만 모니터링 대상 파일로 등록을 해두고 해당 파일을 서버가 로테이션으로 관리해주는 것이 좋다. 

: pos - 모니터링 대상 파일 내용을 어디까지 읽었는지 기록해두는 파일이다. 해당 파일에 기록된 위치를 기반으로 파일에 새로운 내용이 쓰이거나 td-agent가 재시작되었을 때 중복되지 않게 로그를 읽을 수 있게 해 준다. 

: tag - 읽어 들인 파일에 대해 구분 값을 붙여 주는 것이다. 이를 기반으로 어느 로그 가공 / 전송 규칙을 따를지가 결정이 되는 것이다. 

: parse - 읽은 로그의 파싱 규칙을 지정하는 태그이다. 

<source>
  @type tail
  path /myserver/log/server.log
  pos_file /home/user/log/td-agent/server.log.pos
  tag mylog-test
  <parse>
    ...
  </parse>
</source>

<parse> tag에서는 읽어 들인 로그에 대해서 어떻게 처리를 할 것인지를 정할 수 있다. 

예시는 정규 표현식으로 로그를 읽어 들인다. 

- 정규 표현식에 맞지 않는 로그는 drop 된다. 

- 정규 표현식을 이용하여 로그를 세부적으로 나눌 수 있다. 

: ?<> 규칙을 이용하여 로그 내에서 logtime과 id를 뽑아내는 예시이다.

: 해당 로그에서 time_key를 logtime으로 지정해준다. (time을 뽑아내기 위해서 현재 logtime이 어떠한 형식으로 저장되었는지를 fluentd에 time_format을 통해 알려준다.)

: 기본적으로 정규표현식으로 뽑아낸 type은 string이기 때문에 이를 다른 type으로 처리하기 위해서는 types로 어떤 타입인지 지정해준다. 

<parse>
  @type regexp
  expression /^\[(?<logtime>[^\]]*)\] (?<id>\d*)$/
  time_key logtime
  time_format %Y-%m-%d %H:%M:%S %z
  types id:integer
</parse>

- 기본적으로 로그는 한 줄 단위로 처리가 되지만 multiline (docs.fluentd.org/parser/multiline)을 통해 여러 줄의 로그를 하나의 로그로 취급할 수 있다. 


(2) 로그 가공하기 

- 로그에 추가적인 정보를 삽입하거나 혹은 제거가 필요한 경우 로그를 가공해주게 된다.

- filter는 이러한 목적에 맞는 다양한 플러그인들을 제공한다.

- 본 글에서는 서버 장비의 hostname을 추가하는 로그 가공법을 예시로 들어 본다. 

: tag의 지정 - <filter mylog-test> 어떤 tag를 가진 로그에 대해서 filter를 지정할지 명시해주어야 한다. 위의 input에서 로그에 대한 tag를 mylog-test로 지정했고 이 로그에 대한 처리를 할 것임을 예시에서 보이고 있다. 

: @type record_transformer - 현재 로그에 hostname을 추가해준다. 

: ruby를 기반으로 ${} 를 실행하는 것이기 때문에 때에 따라 ruby를 사용하겠다는 enable_ruby설정이 필요할 수도 있다. 

<filter mylog-test>
  @type record_transformer
  enable_ruby
  <record>
    hostname ${hostname}
  </record>
</filter>

(3) 로그 Output 지정하기 

- 최종적으로 로그를 내보내기 위한 옵션들도 다양하게 존재한다. 

- 본 예시에서는 로그를 외부로 http를 통해 내보내는 방식을 보여준다.

: forward - 로그를 전송할 때의 전송 옵션을 설정할 수 있다.

: server - 태그에서 어떠한 서버들로 로그를 전송할지 적어준다. 

: secondary - 전송에 실패한 로그에 대해서 기록을 위한 파일을 지정해준다. 

<match mylog-test>
  @type forward
  send_timeout 60s
  recover_wait 10s
  hard_timeout 60s
  
  <server>
    name logstash
    host 127.0.0.1
    port 4000
  </server>
  ...

  <secondary>
    @type file
    path /home/user/log/td-agent/forward-failed
  </secondary>
</match>

(4) 정리

- (1) ~ (3)을 통해 우리는 td-agent.conf가 구성되는 간략한 예시를 살펴보았다.

- 위의 예시는 fluentd에서 logstash로 로그를 전송 한 후 logstatsh에서 로그를 다시한번 가공 및 es로의 전송을 하는 시나로의 일부이다. 

- fluentd에서는 logstash 뿐 아니라 es로의 직접 로그전송도 당연히 가능하기 때문에 각 환경에 맞는 로그 전송 시나리오를 세우고 이에 맞추어 접근하면 좋을 것으로 생각한다. 

반응형

'인프라 공부 > ELK' 카테고리의 다른 글

서버 로그 다루기 - filebeat 편  (0) 2023.05.01