Tagged: ELK

Nginx 로그를 위한 Logstash Pipeline 설정하기

Logstash 를 이용해 로그를 프로세싱 해보자. Logstash 에 대한 기초적인 설정은 다음글에서 확인 가능하다.

또, 이 글은 Elastic 홈페이지에 내용을 기반으로 한다.

filebeat 설정 및 기동

먼저 파일 filebeat 설정을 다음과 한다.

Elastic 홈페이지에는 간단하게 설정하도록 나오지만 여기서는 몇가지 설정을 추가 하였다. tags 를 설정하였고 fields 도 추가 하였다. 다음과 같이 시작 한다.

logstash Nginx pipeline 설정

먼저 filebeat 으로부터 메시지가 잘 들어오는지 디버깅을 먼저 해보자. 다음과 같이 간단하게 설정을 해본다.

INPUT 에는 filebeat 으로부터 전송을 받기 위한 port 를 지정해준다. OUTPUT 에는 디버깅을 위한 화면출력을 설정해 준다.

테스트

filebeat 의 로그 파일에 한 줄 넣어준다.

이렇게 하고 난 후에 logstash 의 출력 로그를 보면 다음과 같이 나온다.

여기서 보아야 할 것은 filebeat 에서 설정한 tags 와 field 다. 이것이 logstash 로 전송될때에 그대로 전송이 된다. message 에는 log 파일에 내용을 담고 있는데 이것을, 이제 필드별로 구별을 해야 한다. 이를 위해서는 로그의 형식을 알아야 한다.

Nginx 로그 형식

Nginx 의 로그 형식은 nginx 설정 파일에 log_format 에 기록되어 있다.

이 형식은 필요에 따라서 변경 될 수 있다. 이 형식을 알아야 한다.

Logstash FILTER pipeline 설정

이제 Nginx Pipeline 에 FILTER 를 설정해야 한다. 일 FILTER 는 들어오는 메시지를 가공처리해주는데, grok 을 이용한다. 메시지를 가공처리하는데 미리 정의된 형식도 지원한다. 다음과 같이 해보자.

filebeat 는 한번 읽은 로그는 다시 읽지 않는다. filebeat 는 중지 시키고, 데이터 디렉토리에 registry 디렉토리를 삭제 한다.

이렇게 하면 파일을 다시 읽는다. 하지만 결과는 필드로 구분되지 않았다. 이것은 미리 정의된 FILTER 가 적용되지 않았음을 의미 한다.

FILTER 의 적용은 grok 을 사용하는데, 이것을 매번 해보는건 힘들다. 그래서 온라인으로 테스트를 할 수 있도록 도와주는 사이트가 있다.

여기에서 샘플데이터를 넣은 후에 패턴을 grok 패턴으로 적용하면 결과를 보여준다. 이 패턴을 이용하면 된다.

grok 의 사용법은 %{SYNTAX:SEMANTIC} 형식인데, SYNTAX 는 패턴이다. SEMANTIC 는 그 패턴을 담는 변수라고 보면 된다. 그런데, 이 패턴은 미리 정의되어 있는데, 다음에서 확인 가능하다.

Nginx 형식에 맞는 grok 패턴을 다음과 같이 입력 해줬다.

이렇게 한 후에 로그를 전송하면 다음과 같이 잘 파싱된다.

Elasticsearch 보안

Elasticsearch 가 버전이 높아지면서 보안이 강화 됐다. 더군다나 Security 플러그인을 활성화할 경우에 각종 Rules와 Roles 들이 생성된다. 뭔가를 하기 위해서는 인증을 거쳐야 한다는 뜻이다.

Logstash 는 최종적으로 Elasticsearch 로 데이터를 보내야 한다. 이에 대한 보안 설정이 필요한데, 이에 대한 자세한 설명은 다음에 잘 나와 있다.

CA 인증서 설정

Elasticsearch 8.1 을 설치할때에 CA 인증서가 config/certs 디렉토리에 생성 되었다. RPM 으로 설치하였을 경우에 /etc/elasticsearch/certs 디렉토리인데, 여기에 http_ca.crt 파일로 존재 한다. 이것을 Logstash 에 OUTPUT 필터에서 사용해야 한다.

Logstash 를 위한 자격증명 만들기

자격증명을 만들기 위해서는 권한을 부여한 역할(Role) 를 만들어야 한다. Kibana 를 설치했다면 Management > Roles 에서 생성할 수 있다. 다음과 같이 만든다.

  • Role 이름: logstash_writer
  • Cluster Privileges: manage_index_templates, monitor, manage_ilm
  • Indices Name: nginx-access-*
  • Indices Privileges: write, create, create_index, manage, manage_ilm
Logstash 를 위한 Role 생성

이것은 다음과 같이 curl 을 이용할 수도 있다. 먼저 Role 을 위한 JSON 파일을 작성한다.

그리고 이제 다음과 같이 curl 명령어를 작성해 실행하면 된다.

이제 사용자를 만들어야 한다. 사용자를 만들때에는 패스워드도 함께 생성하고 앞에서 만든 logstash_writer 롤을 할당해 준다.

Logstash 를 위한 계정생성

역시 이것도 다음과 같이 JSON 형식으로 생성이 가능하다.

logstash OUTPUT 파이프라인 설정

이제 Logstash 의 OUTPUT 파이프라인을 설정해야 한다. 다음과 같다.

결론

logstash OUTPUT 파이프라인 설정이 되면 logstash 와 filebeat 을 재시작 하고 nginx 로그를 넣게 되면 이제 Elasticsearch 에 nginx-access-날짜 로 인덱스가 생성되면서 데이터가 적재된다.

로그 저장과 트래킹

로그(log) 는 각종 시스템과 소프트웨어 프로그램의 정보를 담고 있다. 한 사람이 하나의 시스템, 하나의 소프트웨어 프로그램을 다루거나 관리를 한다면 별 문제가 없겠지만 요즘 처럼 분산형 시스템과 소프트웨어를 사용하는 시대에 로그를 하나씩 다 들여다 본다는 건 불가능이다.

거기다 로그를 본다는 것도 여간 쉬운일이 아니다. 매우 지루하고 많은 시간을 허비해야 하는데, 수 많은 로그속에서 내가 필요로하는 정보를 찾기란 매우 어렵다.

그래서 이것을 손쉽게 처리할 수 있도록 도와주는 프로그램 그룹이 만들어졌는데, 다음과 같은 것이다.

Splunk

스플렁크(Splunk) 는 사용 소프트웨어다. 대량으로 로그를 저장하고 분석하도록 해주는 소프트웨어를 판매하는 회사다. 상용제품이다 보니까 이 제품을 익히는게 중요하다. Splunk Search Processing Language, 줄여서 SPL 을 이용해서 로그에서 필요한 정보를 뽑아 낼 수 있다.

ELK(Elasticsearch, Logstash, Kibana)

Elastic 제품군이다. 엘라스틱서치(Elasticsearch) 검색 소프트웨어로 유명한 Elastic 에서 만드는 것인데, 로그스태쉬(Logstash) 는 실시간으로 로그를 전달 받아서 처리하고 이것을 엘라스틱서치에 저장한다. 키바나(Kibana) 는 엘라스틱서치에 저장한 로그들을 특저한 쿼리를 이용해 시각화 해준다.

로그스태쉬(Logstasch) 대신 플로언트디(FluentD) 를 사용하기도 한다. 로그스태쉬로그스태쉬(Logstasch)보다 메모리를 덜 먹으면서도 가용성이 좋다.

로그 처리를 위한 ELK 를 스택(Stack) 이라고 명명하고 ELK Stack, EFK Stack 이라고 부른다.

ELK stack components

TICK(Telegraf, InfluxDB, Chronograf, Kapacitor)

InfluxDB 와 Telegraf 로 유명한 InfluxData 에서 만든 것이다. Kapacitor 는 ELK 에서 로그스태쉬에 해당한다. Chronograf 는 ELK 의 키바나에 해당된다.

개인적으로 Telegraf, InfluxDB, Grafana 를 이용한 시스템 모니터링은 여러번 사용해본 경험이 있다. InfluxDB 는 마치 RDBMS 처럼 SQL 문을 이용해서 데이터를 조회할 수 있다.