2016-08-16 1 views
0

J'ai essayé l'expression rationnelle suivante dans logstash.config pour extraire une chaîne partielle d'un champ,logstash RegexpError: char invalide dans le nom du groupe

{ 
    "_index": "logstash-2016.08.09", 
    "_type": "log", 
    "_id": "AVZvz2ix", 
    "_score": null, 
    "_source": { 
    "message": "function_name~execute||line_no~128||debug_message~id was not found", 
    "@version": "1", 
    "@timestamp": "2016-08-09T14:57:00.147Z", 
    "beat": { 
     "hostname": "coredev", 
     "name": "coredev" 
    }, 
    "count": 1, 
    "fields": null, 
    "input_type": "log", 
    "offset": 22299196, 
    "source": "/project_root/project_1/log/core.log", 
    "type": "log", 
    "host": "coredev", 
    "tags": [ 
     "beats_input_codec_plain_applied" 
    ] 
    }, 
    "fields": { 
    "@timestamp": [ 
     1470754620147 
    ] 
    }, 
    "sort": [ 
    1470754620147 
    ] 
} 

Par exemple, l'extraction de core.log"source": "/project_root/project_1/log/core.log".

filter { 
    grok { 
    match => ["source", "/(?<[@metadata][log_type]>[^/]+)$"] 
    } 
} 

mais nous avons eu une erreur,

{:timestamp=>"2016-08-16T10:09:41.352000+0000", :message=>"Pipeline aborted due to error", :exception=>#<RegexpError: invalid char in group name <[@metadata][log_type]>: /\/(?<[@metadata][log_type]>[^\/]+)$/m>, :backtrace=>["org/jruby/RubyRegexp.java:1434:in `initialize'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-grok-0.11.2/lib/grok-pure.rb:127:in `compile'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-grok-2.0.5/lib/logstash/filters/grok.rb:264:in `register'", "org/jruby/RubyArray.java:1613:in `each'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-grok-2.0.5/lib/logstash/filters/grok.rb:259:in `register'", "org/jruby/RubyHash.java:1342:in `each'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-filter-grok-2.0.5/lib/logstash/filters/grok.rb:255:in `register'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/pipeline.rb:182:in `start_workers'", "org/jruby/RubyArray.java:1613:in `each'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/pipeline.rb:182:in `start_workers'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/pipeline.rb:136:in `run'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.3.4-java/lib/logstash/agent.rb:473:in `start_pipeline'"], :level=>:error} 

Quel est le problème avec le regex? Cependant,

filter { 
    grok { 
    match => ["source", ".*\/(?<log_type>.*)"] 
    } 
} 

Notez qu'en raison de this issue il est impossible:

Répondre

1

Vous ne l'avez pas aimé la solution using split ;-)

Quoi qu'il en soit, vous devez spécifier votre modèle personnalisé comme celui-ci pour spécifier un champ imbriqué dans la capture nommée de l'expression régulière grok.

Ceci va capturer core.log et le stocker dans le champ log_type de votre événement. Vous pouvez ensuite déplacer log_type vers le champ @metadata si vous le souhaitez.