Software Engineering Note

ELK(Elasticsearch+Logstash+Kibana)를 이용한 로그수집 본문

솔루션/ELK

ELK(Elasticsearch+Logstash+Kibana)를 이용한 로그수집

devmoons 2014. 10. 28. 22:55
본 포스팅에서는 톰캣로그를 수집하는데 ELK를 적용한 내용을 기술합니다.

소개

수 많은 서버가 있는 환경에서 모든 서비스가 제대로 동작하는지 확인하기 위한 방법으로 로그 수집은 의미가 있습니다.

ELK는 로그수집에 적합한 솔루션으로 로그 수집부터 시각화까지 모든 것을 해결해주죠.

ELK는 Elasticsearch + Logstash + Kibana의 조합으로 흔히 ELK Stack이라고 부릅니다.

로그 수집에 ELK를 적용할 때 각 모듈의 기능은 다음과 같습니다.

Elasticsearch: 로그 저장소
Logstash: 로그 수집기/처리기
Kibana: 수집된 데이터 시각화

여기에 Redis를 끼워넣는 등 다양하게 확장이 가능합니다.

우리는 아래 구성도에도 나오듯이 로그가 떨어지는 서버의 부하를 줄이고자 특별히 logstash forwarder를 이용했습니다.


설치


다음 링크를 따라가면 압축만 풀면되는 형태로 쉽게 설치할 수 있습니다.

다음 블로그에도 설치에 대한 설명이 잘 되어있구요.

그 외, 설치에 대한 구체적인 설명은 없습니다. ㅠㅠ


구성도

전체 구성도는 다음과 같습니다.


구성도는 크게 세 부분으로 나뉘는데요.


collector

- 로그를 수집해서 indexer로 던집니다.

서비스 서버에 적용하는 것을 감안, logstash-forwarder를 이용했습니다.

(logstash forwarder: https://github.com/elasticsearch/logstash-forwarder)

- 이렇게 하면 collector는 단순히 로그를 tailing해서 던지기 때문에, 서비스 중인 서버에 부담을 덜 수 있습니다.


indexer

- 전달받은 로그를 분석해서 의미있는 필드로 뽑아낸 후에 elasticsearch에 저장합니다.

- 여기에 logstash가 사용 되었습니다.


db

- 말 그대로 데이터 저장소

- elasticsearch에 데이터가 저장되고 kibana를 이용해서 그래프로 뽑아볼 수 있습니다.



설정


인증서 생성


logstash와 logstash-forwarder간 통신을 위해서 꼭 필요합니다.


indexer 서버들의 '/etc/pki/tls/openssl.cnf' 파일을 다음과 같이 수정합니다. 


서버가 여러대라면 모든 서버 IP를 등록한 후 인증서를 생성합니다. 키 생성은 한 곳에서 하고, 모든 서버가 생성된 파일을 공유해서 사용하면 됩니다.


openssl.cnf

...

[v3_ca]

subjectAltName = IP:ip1, IP:ip2, IP:ip3

...


키생성

openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash-forwarder.key -out logstash-forwarder.crt


생성된 두 파일은 logstash, logstash-forwarder 에서 모두 사용해야 하며, 설정파일에 파일 경로를 기술해주면 됩니다.



logstash-forwarder 설정


logstash-forwarder.json

{

   "network": {

       # indexer ip list

       "servers": [ "ip1:port", "ip2:port", "ip3:port" ],

       "ssl certificate": "/logstash-forwarder/cert/logstash-forwarder.crt",

       "ssl key": "/logstash-forwarder/cert/logstash-forwarder.key",

       "ssl ca": "/logstash-forwarder/cert/logstash-forwarder.crt",

       "timeout": 15

   },

  "files": [

       {

           "paths": [

               "로그파일 경로"

            ]

        }

    ]

}


'servers'에 indexer 들을 지정해 놓으면 랜덤으로 하나를 골라 로그를 보냅니다.


연결이 끊기는 경우는 다른 indexer와 연결을 맺고, 로그를 보냅니다. 이미 연결이 끊기는 경우에 대한 보완이 되어있는 셈이죠.



logstash 설정


logstash.conf

input {

  # logstash forwarder와 연동할 때는 lumberjack 설정을 해줍니다.

  lumberjack {

    port => 포트번호

    ssl_certificate => "/logstash/cert/logstash-forwarder.crt"

    ssl_key => "/logstash/cert/logstash-forwarder.key"

    type => "errorlog"

  }

}

filter {

   if [type] == "errorlog" {

      # 여러 라인을 하나로 모을 수 있습니다. stack trace를 모두 가져오고싶을때 유용합니다.

      multiline {

          pattern => "(^\d+\serror)|(^.+Exception: .+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Caused by:.+)|(^\D.+)"

          what => "previous"

      }

      # 여기서 필요한 필드들을 추출할 수 있습니다.

      # loglevel, classname.. 등이 별도의 필드로 추출되고, kibana에서 필드단위로 값을 쉽게 확인할 수 있습니다.

      grok {

         patterns_dir => "./patterns"

         match => [ "message", "^%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} \[%{WORD:classname}\] - %{GREEDYDATA:description}" ]

      }


      # 한국 시간에 맞추기 위한 설정

      ruby {

          code => "

              event['@timestamp'] = event['@timestamp'].localtime('+09:00')

          "

      }

   }

}

filter {

   # 에러나 경고가 아닌 경우에는 제거합니다.

   if [type] == "errorlog" {

      if [loglevel] != "ERROR" and [loglevel] != "WARN" {

          drop { }

      }

   }

}

output {

  elasticsearch {

     protocol => "node"

     index => "logstash-error-%{+YYYY.MM.dd}"

  }

}


마치 체인처럼 설정이 연결되어 있습니다. (입력 -> 필터링 -> 저장)


logstash에서 별도로 호스트를 지정하지 않고, 클러스터군으로 넣으려면 elasticsearch 설정파일을 logstash 디렉토리 함께 포함시켜줘야 합니다. 설정파일은 elasticsearch에서 가져오면 됩니다.


다른 부분은 그대로 두고 다음 부분을 추가합니다. (elasticsearch cluster가 3대인 경우)


discovery.zen.ping.unicast.hosts: ["ip1", "ip2", "ip3"]



실행


elasticsearch

bin/elasticsearch -d


logstash

bin/logstash agent -f logstash.conf


logstash-forwarder

bin/logstash-forwarder -config logstash-forwarder.json



참고링크

- fluentd 와 비교: http://jasonwilder.com/blog/2013/11/19/fluentd-vs-logstash/

- 톰캣로그 관련 logstash 설정: http://www.logstashbook.com/code/6/shipper.conf

- logstash forwarder: http://michael.bouvy.net/blog/en/2013/12/06/use-lumberjack-logstash-forwarder-to-forward-logs-logstash/