본문 바로가기

Big Data/Elastic stack

elastic stack #3 logstash 소개 & quick start

#Logstash란?
공식페이지에서는 data collection engine 라고 소개하고 있다. 즉, 데이터를 수집하여 전달하는 역할을 하는 도구이다.
데이터를 그대로 전달할 수 도 있고, 데이터를 가공하여 전달할 수 있다. 여러 플러그인을 통해 다른 시스템과의 호환성도 좋다.
주로 Elasticsearch와 함께 쓰인다.


#Logstash 설치
https://www.elastic.co/downloads/logstash 에서 다운받아 압축을 푼다. 이게 설치 끝이다.
데이터를 수집하는 역할을 하기 때문에 주로 application server의 로그를 저장한다는 가정하에 각 server에 설치하여 동작하도록 하는 구조이다.
일단 다음 포스팅으로 ELK Stack을 사용하여 web server 의 로그를 저장하는 방법에 대해 작성할 것이다. 지금은 간단히 logstash를 간단히 체험해보는 정도의 예제를 작성하겠다.


#Logstash 설정 및 실행
logstash실행시 jvm이나 logstash 실행시 동작하는 옵션을 지정할 수 있다. /config 폴더에 있는 파일들로 해당 옵션들을 설정할 수 있다.
이번 예제에서는 그냥 기본설정을 사용한다.

logstash실행은 아주 간단하다. 

> bin/logstash -f logstash.conf

-f 옵션으로 지정하는 logstash.conf는 다운로드 받은 파일들중에 없다. 즉 만들어야된다는 것이다.
이 config파일은 어떤 data를 읽어서 어떻게 가공하고 어디로 보내냐를 명시하는 것이다.
다음이 logstash 설정파일의 popeline 구성이다.

logstash config 구조(참조: http://asuraiv.blogspot.kr)

intput {
...
}
filter {
...
}
output {
....
}

위 구조가 기본적인 logstash의 설정파일 구조이다. filter는 생략가능하며 input과 output은 필수로 명시해야한다.

input, filter, output 으로 사용할 수 있는 옵션들은 엄청 다양하고 유용한것들이 많다.
이번 예제에서는 아주 간단하게 

input: 키보드 입력
filter: JSON 
output: 화면 단순 출력

으로 간단하게 logstash를 맛보자.

input {
  stdin { }
}
filter {
  json {
    source => "message"
    add_field => { "added-field" => "AA" }
    remove_field => [ "tmp" ]
  }
}
output {
  stdout {
    codec => rubydebug { }
  }
}

위 config에 대한 설명을 하자면,
input: stdin으로 키보드 입력을 받겠다는 의미이다.
filter: 입력받은 데이터를 json으로 자동파싱한다. source로 입력으로 받을 타입을 명시한다. 그리고 add_field로 필드를 추가하고 remove_field로 필드를 삭제한다.
output: rubydebug로 단순 화면 출력을 한다.


> sudo bin/logstash -f logstash.conf
Sending Logstash's logs to /Users/jiminsub/Apps/Dev/logstash-5.1.1/logs which is now configured via log4j2.properties
The stdin plugin is now waiting for input:
[2017-03-13T00:39:05,094][INFO ][logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
[2017-03-13T00:39:05,116][INFO ][logstash.pipeline ] Pipeline main started
[2017-03-13T00:39:05,212][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
#입력값
{"name":"MS Ji","age":33,"tmp":"temp value"}
#출력값
{
  "@timestamp" => 2017-03-12T15:39:39.307Z,
  "@version" => "1",
  "host" => "Minsubsui-MacBook-Pro.local",
  "name" => "MS Ji",
  "message" => "{\"name\":\"MS Ji\",\"age\":33,\"tmp\":\"temp value\"}",
  "added-field" => "AA",
  "age" => 33,
  "tags" => []
}