2014-09-24 3 views
0

Я пытаюсь настроить logstash для управления моими различными источниками журналов, одним из которых является Mongrel2. Формат, используемый Mongrel2 является tnetstring, где регистрационное сообщение примет формуШаблоны фильтра groch для logstash

86:9:localhost,12:192.168.33.1,5:57089#10:1411396297#3:GET,1:/,8:HTTP/1.1,3:200#6:145978#] 

Я хочу, чтобы написать свои собственные шаблоны ГРОК извлечь определенные поля из вышеуказанного формата. Я получил помощь по this question, пытаясь извлечь хост. Так что, если в grok-patterns я определяю

M2HOST ^(?:[^:]*\:){2}(?<hostname>[^,]*) 

, а затем в logstash конф указать

filter { 
    grok { 
    match => [ "message", "%{M2HOST}" ] 
    } 
} 

это работает, как ожидалось. Проблема, которую я сейчас имею, - это указать несколько шаблонов, например. M2HOST, M2ADDR и т.д. Я попытался определения дополнительных параграфов в одних и тех же ГРОК-шаблоны файл

M2HOST ^(?:[^:]*\:){2}(?<hostname>[^,]*) 
M2ADDR ^(?:[^:]*\:){3}(?<address>[^,]*) 

и изменение logstash конф

filter { 
    grok { 
    match => [ "message", "%{M2HOST} %{M2ADDR}" ] 
    } 
} 

, но теперь я просто получаю ошибку _grokparsefailure.

+0

ваша проблема здесь конкатенация, думаю заменив M2HOST и M2ADDR своим регулярным выражением, вы получите '^ (?: [^:] * \:) {2} (? [^,] *)^(?: [^:] * \ :) {3} (?

[^,] *) 'У вас есть начало линии в середине вашего матча, что, очевидно, не может Работа. Основная идея с puliples ALIASES состоит в том, чтобы разделить часть регулярного выражения, чтобы повторно использовать их, но не волшебным образом объединить их. – Tensibai

+0

ах ок. Я хочу применить к сообщению сообщение M2HOST, а затем сообщение M2ADDR. Знаете ли вы, какой будет правильный синтаксис? –

+1

Ну, я бы поработал с тестировщиком grok, который вы уже знаете, попробуйте, чтобы соответствовать каждому полю, после этого вы можете разделить интересные части. для этого exmeple я бы сказал (испытал) '(?: [^:] *:) {2} (? [^,] *) [^:] * :(?

[^,] *)' будет делать – Tensibai

ответ

1

с входом образца от другого вопроса и с некоторыми догадываясь об именах значений полный матч будет:

(?:[^:]*:){2}(?<hostname>[^,]*)[^:]*:(?<address>[^,]*)[^:]*:(?<pid>[^#]*)[^:]*:(?<time>[^#]*)[^:]*:(?<method>[^,]*)[^:]*:(?<query>[^,]*)[^:]*:(?<protocol>[^,]*)[^:]*:(?<code>[^#]*)[^:]*:(?<bytes>[^#]*).*

Производство:

{ 
    "hostname": [ 
    [ 
     "localhost" 
    ] 
    ], 
    "address": [ 
    [ 
     "192.168.33.1" 
    ] 
    ], 
    "pid": [ 
    [ 
     "57089" 
    ] 
    ], 
    "time": [ 
    [ 
     "1411396297" 
    ] 
    ], 
    "method": [ 
    [ 
     "GET" 
    ] 
    ], 
    "query": [ 
    [ 
     "/" 
    ] 
    ], 
    "protocol": [ 
    [ 
     "HTTP/1.1" 
    ] 
    ], 
    "code": [ 
    [ 
     "200" 
    ] 
    ], 
    "bytes": [ 
    [ 
     "145978" 
    ] 
    ] 
} 
Смежные вопросы