ELK/Logstash

Logstash 6.x Json 포맷 Log 파일 입력 받아 ElasticSearch6.x 에 Template 기반 출력 하는 법

Lucas-Kim 2018. 11. 20. 15:40





Logstash에서 json 포맷의 로그파일 input으로, Elasticsearch에 ouput 시키기


0. log 파일 내용

{"id":"1", "hashtag" : "해시테그1"}

{"id":"2", "hashtag" : "해시테그2"}

{"id":"3", "hashtag" : "해시테그3"}

,,,,,




1. Logstash 설정 파일 (eg, logstash-backpack-hashtag.conf)


input {
file {
path => "/usr/local/nodejs/backpack/logs/backpack-api-posting.log"    // 로그 파일 경오
start_position => "beginning"    // 시작점 부터 읽어 드리는 옵션
}
}

filter{
  json {
    source => "message"    // 해당 log 각각의 row
  }
}

output {
elasticsearch {
hosts => ["xxx.xxx.xxx.xxx:9200"]
index => "backpack_postings"    // 엘라스틱 서치 인덱스 명
document_type => "postings"    // 엘라스틱 서치 타입 명
document_id => "%{id}"        // 엘라스틱 도큐먼트 id, 위에서는 json format의 id값
template_name => "backpack_postings"    // 맵핑시킬 엘라스틱서치 탬플릿 명
}
}




2. 엘라스틱서치 템플릿

+nori 형태소 분석기, ngram, edge_ngram 적용 케이스


#템플릿 등록
PUT _template/backpack_hashtags
{
"template": "backpack_hashtags",
"settings": {
"analysis": {
"analyzer": {    // 분석기 설정,,,
"korean_analyzer" : {
"type" : "custom",
"tokenizer": "korean_tokenizer",
"filter" : ["stop", "lowercase", "trim"]
},
"ngram_analyzer" : {
"type" : "custom",
"tokenizer" : "ngram_tokenizer",
"filter" : ["lowercase", "trim"]
},
"edge_ngram_analyzer" : {
"type" : "custom",
"tokenizer" : "edge_ngram_tokenizer",
"filter" : ["lowercase", "trim"]
}
},
"tokenizer": {    // 토크나이저 설정,,,
"korean_tokenizer": {
"type": "nori_tokenizer",
"decompound_mode": "mixed",
"user_dictionary": "userdict_ko.txt"
},
"ngram_tokenizer" : {
"type" : "ngram",
"min_gram" : "1",
"max_gram" : "5",
"token_chars": [ "letter", "digit"]
},
"edge_ngram_tokenizer" : {
"type" : "edge_ngram",
"min_gram" : "1",
"max_gram" : "5",
"token_chars": [ "letter", "digit"]
}
}
}
},
"mappings": {
"hashtags" : {    // 타입 명
"properties": {
"hashtag" : {    
"type": "text",
"fields" : {    // 필드 정의
"hashtag_ko" : {"type" : "text", "analyzer" : "korean_analyzer", "boost": 3},
"hashtag_ng" : {"type" : "text", "analyzer" : "ngram_analyzer", "boost": 1},
"hashtag_ed" : {"type" : "text", "analyzer" : "edge_ngram_analyzer", "boost": 2}
}
}
}
}
}
}



3. 해당 템플릿으로 인덱스 생성


backpack_hashtags


PUT /backpack_hashtags

인덱스 정보를 채우지 않아도, 해당 템플릿으로 지정한 이름으로 맵핑되어 인덱스가 생성 됩니다.


4. logstash 실행


../bin/logstash -f ./logstash-backpack-hashtag.conf



5. elasticsearch 데이터 확인


#GET /backpack_hashtags/hashtags/_search?pretty