2016-08-16 2 views
0

Я пытался следующее регулярное выражение в logstash.config извлечь часть строки из поля,logstash RegexpError: недопустимый символ в названии группы

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

Например, извлечение core.log из "source": "/project_root/project_1/log/core.log".

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

но получил ошибку,

{: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} 

Что случилось с регулярным выражением?

ответ

1

Так что вам не нравится в solution using split ;-)

Во всяком случае, вы должны указать свой собственный шаблон, как это:

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

Заметим, однако, что из-за this issue не представляется возможным для указания вложенного поля в названном захвате регулярного выражения grok.

Это займет core.log и сохранит его в поле log_type вашего мероприятия. Затем вы можете переместить log_type в поле @metadata, если хотите.

Смежные вопросы