Logstash filter 관련 질문입니다

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

{
  "_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"
    }
}

안녕하세요.

아마 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 으로 넣은 것을 나중에 해석하는 방식이 아닙니다.

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

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

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

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