2016-12-27 1 views
0

logstash 구성에 문제가 있습니다. 아래에서 내 logstash 구성을 찾을 수 있습니다.로그 검색을 통해 탄성 검색. 점이있는 키

루비 필터는 모든 점을 제거합니다. 내 분야에서. 모든 것이 잘 작동하는 것으로 보입니다 - 데이터 필터링의 결과는 정확하지만 elasticsearch는 마술로 "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"Field name [/ConsumerAdminWebService/getConsumerTransactions.call] cannot contain '.'"}으로 응답합니다. 여기서 getConsumerTransactions.call은 내 필드 키 중 하나입니다.

input { 
    http_poller { 
    urls => { 
     uatBackend1 => { 
     method => get 
     url => "http://some-url/" 
     headers => { 
      Accept => "application/json" 
     } 
     } 
    } 
    request_timeout => 60 
    # Run every 30 seconds 
    schedule => { cron => "* * * * * UTC"} 
    codec => "json" 
    metadata_target => "http_poller_metadata" 
} 
} 
filter { 
    ruby { 
    init => " 
     def remove_dots hash 
      new = Hash.new 
      hash.each { |k,v| 
       if v.is_a? Hash 
        v = remove_dots(v) 
       end 
       new[ k.gsub('.','_') ] = v 
       if v.is_a? Array 
        v.each { |elem| 
         if elem.is_a? Hash 
          elem = remove_dots(elem) 
         end 
         new[ k.gsub('.','_') ] = elem 
        } unless v.nil? 
       end 
      } unless hash.nil? 
      return new 
     end 
    " 
    code => " 
     event.instance_variable_set(:@data,remove_dots(event.to_hash)) 
    " 
} 
} 
output { 
    elasticsearch { 
    hosts => localhost 
    } 
} 

나는 코드 줄이 정확하지 않은 것을 두려워 : event.instance_variable_set(:@data,remove_dots(event.to_hash)) - 결과 데이터는 어떻게 든 이벤트에 고정되어 있지만 원본 데이터는 변경되지 않고 지속 및 API를 Elasticsearch에 전달된다.

좀 해명이 여기에 요구되는 가정 :

  • 내가 사용하는 ES 버전> 2.0 그래서 점
  • 루비 필터는 "_"로 점을 교체해야합니다 수 없습니다 그것은 잘 작동 - 결과 데이터가 완전히이다 정확한 그러나 ES는 언급 한 오류로 답장합니다. 나는 필터가 이벤트 데이터를 대체하지는 않지만 단순히 Event 객체에 새로운 필드를 추가한다고 의심한다. ES는 여전히 업데이트 된 것이 아닌 원시 데이터를 읽습니다.

루비 나에게 마법 :

+0

사용중인 ES 버전은 무엇입니까? – Kulasangar

+0

예외를 확인하는 것이 좋습니다 : event.instance_variable_set (: @ data, remove_dots (event.to_hash)) 구출 예외 => e 이벤트 [ 'logstash_ruby_exception'] = '필드 도트 정리 :'+ e. 메시지 끝 –

+0

@ Kulasangar 나는 ES 버전 2.3.1을 사용합니다. – adgon92

답변

0

것은 당신이 그것을 ES는 . 점을 포함하는 필드를 선택하지 않는 버전 문제가 될 수있는 ES 버전 2.0을 사용하는 경우입니다 정직합니다. 이 thread이 응답에 따르면

: _ or - 같은 대신 . 점을 이용하여 무언가에

Field names cannot contain the . character in Elasticsearch 2.0.

주변 작업이 mutate에있을 수 있습니다으로 (이름 변경) 귀하의 필드 이름. 이 ticket 꽤 많은이 문제를 설명합니다. . 도트는 2.0 이후의 ES 버전에서 사용할 수 있습니다. 희망이 도움이됩니다!

+0

죄송하지만 도움이되지 않습니다. 나는 그것에 대해 알고 있었고, 그래서 점들을 "-"로 대체하는 재귀 필터를 추가했습니다. 내 질문에 대한 자세한 내용을 추가했습니다. – adgon92