2016-06-30 1 views
4

URL에서 검색어 매개 변수를 추출하려고합니다. (예상대로) attrib의 선두로부터 해시를 생성Logstash가 URL에서 배열 색인을 파싱하지 못했습니다.

127.0.0.1 - - [09/May/2016:09:32:19 +0200] "GET /ps?attrib[vendor][]=GOK&attrib[vendor][0]=GOK HTTP/1.1" 200 12049 "-" "-" 

: 내가 구문 분석있어 로그 파일에서 열세 라인은 다음과 같이 보입니다. 그러나, 두 번째 선두로부터는 예외로 연결 :

IndexError: string not matched 
      []= at org/jruby/RubyString.java:3910 
      set at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-event-2.3.3-java/lib/logstash/util/accessors.rb:64 
      []= at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-event-2.3.3-java/lib/logstash/event.rb:136 
     filter at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-kv-2.1.0/lib/logstash/filters/kv.rb:287 
      each at org/jruby/RubyHash.java:1342 
     filter at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-kv-2.1.0/lib/logstash/filters/kv.rb:287 
    multi_filter at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.3-java/lib/logstash/filters/base.rb:151 
      each at org/jruby/RubyArray.java:1613 
    multi_filter at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.3-java/lib/logstash/filters/base.rb:148 
    filter_func at (eval):189 
    filter_batch at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.3-java/lib/logstash/pipeline.rb:267 
      each at org/jruby/RubyArray.java:1613 
     inject at org/jruby/RubyEnumerable.java:852 
    filter_batch at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.3-java/lib/logstash/pipeline.rb:265 
    worker_loop at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.3-java/lib/logstash/pipeline.rb:223 
    start_workers at /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.3-java/lib/logstash/pipeline.rb:201 

내가 logstash이 문자열로 URL에서 배열 인덱스를 해석하기 때문에 인덱스가 실제로 정수있는 동안 즉, 같아요.
인터넷 검색 및 다른 설정 시도가 있은 후에 막 다른 골목에 섰습니다. 이 아이디어를 만드는 방법에 대한 아이디어는? 디버깅 목적

:

logstash의 구성

input { 
    file { 
    path => "/var/log/apache2/some.log" 
    start_position => "beginning" 
    sincedb_path => "/dev/null" 
    } 
} 

filter { 
    grok { 
    match => { 
     "message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth}\s?(%{NUMBER:seconds:int}\/%{NUMBER:microseconds:int})? \[%{HTTPDATE:timestamp}\] "%{WORD:verb} (%{WORD:schema}:)?[\S]+/(%{DATA:endpoint})\?%{DATA:query_string} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}(\s{1}(?:%{HOSTNAME:backend_used}|-) (?:%{NUMBER:backend_time_seconds:float}|-)s)?' 
    } 
    } 

    urldecode { 
    field => "query_string" 
    charset => "ISO-8859-1" 
    } 

    kv { 
    field_split => "&" 
    source => "query_string" 
    recursive => true 
    allow_duplicate_values => false 
    } 

    date { 
    match => [ "timestamp", "dd/MMM/YYYY:HH:mm:ss Z" ] 
    locale => en 
    } 

    geoip { 
    source => "clientip" 
    } 

    useragent { 
    source => "agent" 
    target => "useragent" 
    } 
} 

output { 
    stdout { 
    codec => json 
    } 
} 

커스텀 동적 템플릿

{ 
    "template": "apache_elk_example", 
    "settings": { 
    "index.refresh_interval": "5s" 
    }, 
    "mappings": { 
    "_default_": { 
     "numeric_detection" : true, 
     "dynamic_templates": [ 
      { 
       "message_field": { 
       "mapping": { 
        "index": "analyzed", 
        "omit_norms": true, 
        "type": "string" 
       }, 
       "match_mapping_type": "string", 
       "match": "message" 
       } 
      }, 
      { 
       "string_fields": { 
       "mapping": { 
        "index": "analyzed", 
        "omit_norms": true, 
        "type": "string", 
        "dynamic": true, 
        "fields": { 
         "raw": { 
          "index": "not_analyzed", 
          "ignore_above": 256, 
          "type": "string" 
         } 
        } 
       }, 
       "match_mapping_type": "string", 
       "match": "*" 
       } 
      } 
     ], 
     "properties": { 
      "geoip": { 
       "dynamic": true, 
       "properties": { 
       "location": { 
        "type": "geo_point" 
       } 
       }, 
       "type": "object" 
      }, 
      "@version": { 
       "index": "not_analyzed", 
       "type": "string" 
      } 
     }, 
     "_all": { 
      "enabled": true 
     } 
    } 
    } 
} 
,

답변

2

attrib[vendor][]=GOKattrib[vendor][0]=GOK은 의미 상 PHP와 동등하므로 kv 필터 바로 앞에있는 숫자 인덱스를 제거하는 것으로 생각해 보셨습니까? 다음과 같음 :

# Remove numeric indices from arrays, otherwise the kv filter will choke, eg: 
    # attrib[vendor][0]=GOK becomes attrib[vendor][]=GOK 
    mutate { 
    gsub => [ 
     "query_string", "\[\d+\]", "[]" 
    ] 
    } 

    kv { 
    ... 
    } 
관련 문제