일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스프링 AOP
- c# scv
- b-tree index
- sprintboot
- 마드리드
- Kotlin
- 본식후기
- 세비야
- HTTP #웹기술
- 바르셀로나
- elk
- @Component
- git명령어
- 그라나다
- 아펠가모 선릉
- 아펠가모선릉
- db index
- kopring
- 400에러
- 스페인
- 아펠가모
- 코프링
- 코틀린 함수
- HTTP
- 스페인 준비물
- 관심지향프로그래밍
- http상태코드
- 코틀린
- Srping AOP
- kotiln
- Today
- Total
끄적이는 메모장
서버 로그 다루기 - Fluentd 편 본문
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 |
---|