들어가며..
이전 포스트에서 Logstash와 Elasticsearch를 연동하여 인덱싱하는 방법을 살펴보았다. 참고
오늘은 bulk format의 데이터를 Logstash를 이용해 인덱싱하는 방법을 정리하겠다. 하지만 기본적으로 Logstash는 bulk format을 처리하지 못한다. 왜 그런지 아래 예제를 보며 살펴보겠다.
일단 로그스태쉬 configuration은 아래와 같이 작성한다.
input { file { codec => json path => "/home/asuraiv/logstash_data/*.json" } } output { elasticsearch { host => "localhost" index => "school" index_type => "students" protocol => "http" template_name => "school" } stdout { codec => rubydebug { metadata => true } } }input plugin은 'file'을 사용하였다. 'path' 값으로 설정된 경로안에 json 확장자 파일이 저장되면 Logstash의 file input plugin이 자동으로 그 파일을 읽어 output으로 보내준다.
아래와 같은 bulk format을 저장하여 인덱싱을 시도해보자
{ "index" : { "_index" : "school", "_type" : "students", "_id" : "1" }} { "address" : "newyork", "name" : "james", "class" : "A" }하지만 결과는 아래와 같다
{ "index" => { "_index" => "school", "_type" => "students", "_id" => "1" }, "@version" => "1", "@timestamp" => "2015-09-03T08:03:14.064Z", "host" => "cweb02.ami", "path" => "/home1/irteam/logstash_data/data.json", "@metadata" => { "retry_count" => 0 } } { "address" => "los engeles", "name" => "kim", "class" => "C", "@version" => "1", "@timestamp" => "2015-09-03T08:03:14.065Z", "host" => "cweb02.ami", "path" => "/home1/irteam/logstash_data/data.json", "@metadata" => { "retry_count" => 0 } }원래 bulk format은 첫번째줄이 meta정보, 두번째줄이 source 데이터이다. 따라서 2줄이 하나의 event로 인식되야 하는것인데 지금은 각 라인이 서로 다른 event로 인식되어 따로따로 인덱싱이 되었다.
bulk format에서 첫째줄 메타정보에 인덱싱을 수행할 인덱스, 타입, id값등을 설정할 수 있지만 위와같은 결과가 나오면 이 메타정보가 아무 소용이 없다. 두번째 줄의 데이터가 인덱싱이 된것도 Logstash configuration에 'index'와 'index_type'이 명시되어있기 때문에 정상적으로 인덱싱이 된것이다.
따라서 bulk format을 정상적으로 인지하면서, 메타정보에 맞게 유동적으로 index, type, id등을 설정하여 인덱싱을 하려면 어떻게 해야할까?
es_bulk codec
input 단계에서 bulk format을 파싱하여 메타데이터와 source데이터를 하나의 이벤트로 묶어주는 codec이 있다.
Logstash 설치 폴더의 'bin' 에서 아래와 같은 명령어로 설치가 가능하다 (Logstash 1.4+)
$ ./plugin install logstash-codec-es_bulk그리고 configuration 파일의 input 설정부분에 아래와 같이 작성한다
input { file { path => "/home/asuraiv/logstash_data/*.json" codec => es_bulk { } } }위의 하이라이트된 설정을 추가한다. es_bulk 코덱안에는 별다른 설정이 없는 그냥 비어있는 중괄호 { } 이다.
이 코덱을 적용하면 bulk format의 메타데이터 부분은 '@metadata' 로 넣어주고, filter나 output plugin에서 "{[@metadata][_index]}" 와 같은 방식으로 접근할 수 있다. 따라서, output pulgin을 아래와 같이 작성하면 bulk format에 메타데이터에 따라 유동적으로 인덱싱할 인덱스, 타입, id를 지정할 수 있다
elasticsearch { host => "localhost" index => "%{[@metadata][_index]}" index_type => "%{[@metadata][_type]}" document_id => "%{[@metadata][_id]}" protocol => "http" template_name => "school" }
댓글 없음:
댓글 쓰기