Logstash filter 관련 질문입니다


(한흥규) #1

현재 키바나에서 검색되는 데이터의 형식은 이러합니다.

{
  "_index": "ggg",
  "_type": "log",
  "_id": "AV55PAZJZmaqPQPklyRh",
  "_version": 1,
  "_score": null,
  "_source": {
    "date": "201709120590",
    "geoip": {},
    "offset": 338,
    "max": "1000",
    "input_type": "log",
    "source": "d:\\log.log",
    "message": "{\"date\": \"201709120590\",\"max\": \"1000\",\"locations\": [{\"lat\": \"37.12611770687813\",\"lon\": \"126.77791213876573\"}]}",
    "type": "log",
    "tags": [
      "beats_input_codec_plain_applied",
      "_dateparsefailure",
      "_geoip_lookup_failure"
    ],
    "@timestamp": "2017-09-13T03:15:29.392Z",
    "@version": "1",
    "beat": {
      "hostname": "DESKTOP-993J7Q2",
      "name": "DESKTOP-993J7Q2",
      "version": "5.5.2"
    },
    "host": "DESKTOP-993J7Q2",
    "locations": [
      {
        "lon": "126.77791213876573",
        "lat": "37.12611770687813"
      }
    ]
  },
  "fields": {
    "@timestamp": [
      1505272529392
    ]
  },
  "sort": [
    1505272529392
  ]
}

현재 locations 에 geo_point 맵핑을 해주고싶지만 해당 부분이 진행이 되질않아 질문드립니다...

아래는 logstash conf 파일 설정입니다.
input {

	beats { port => "5044"
	}

}
filter {
	json{
	source => 'message'
	}
  date{
	match => ["date" , "yyyyMMddHHmmss"]
  }

    mutate {
      convert => {
        "[location][lat]" => "float"
        "[location][lon]" => "float"
      }
    }

}
output {  
   
    stdout {
		codec => rubydebug
	}

	elasticsearch {
        hosts => "localhost:9200"
        index => "ggg"
    }
}

(Jongmin Kim) #2

안녕하세요.

아마 Beats 를 통해 넣으신 것 같은데, 우선 소스 데이터는 전부 Message 필드 안에 들어가 있습니다.

"message": "{\"date\": \"201709120590\",\"max\": \"1000\",\"locations\": [{\"lat\": \"37.12611770687813\",\"lon\": \"126.77791213876573\"}]}",

여기 locations 필드에

,\"locations\": [{\"lat\": \"37.12611770687813\",\"lon\": \"126.77791213876573\"}

이런 모양으로 들어가 있는데, 실제로 Elasticsearch 에도 저렇게 들어가는 것이 맞습니다. 정확히는

"locations":{
  "lat": 37.12611770687813,
  "lon": 126.77791213876573 
}

이렇게 들어가야 하고요, elasticsearch 의 인덱스의 mapping 정보를 locations 필드를 "geo_point" 형식으로 정의하셔야 합니다.

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "locations":{
          "type": "geo_point"
        }
      }
    }
  }
}

이렇게 인덱스를 만들고 넣으시면 됩니다. 로그스태시 셋팅에

 mutate {
      convert => {
        "[location][lat]" => "float"
        "[location][lon]" => "float"
      }
    }

이 부분은 빼셔야 합니다. 실제로는 location 필드가 geo_point 형식으로 들어가는 것이지, object 형식의 float 으로 넣은 것을 나중에 해석하는 방식이 아닙니다.


(한흥규) #3

kimjmin 님 안녕하세요 답변 감사합니다.

해당 문제는 kimjmin 말씀대로 template 적용을 통하여 해결하였습니다.

template 개념을 몰라 해결하지 못하고있었습니다. 감사합니다!


(system) #4

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.