2016-12-21 2 views
0

Я пытаюсь спрятать файл журнала в elasticsearch с помощью Logstash. При этом я столкнулся с проблемой.Трудно записать файл журнала с различным появлением порядка для поля с помощью Logstash

Если файл журнала имеет тот же самый вид журнала линий, как показано ниже,

[12/Сен/2016: 18: 23: 07] VendorID = 5037 Код = С AcctID = 5317605039838520 [12/Sep/2016: 18: 23: 22] VendorID = 9108 Код = A AcctID = 2194850084423218 [12/Sep/2016: 18: 23: 49] VendorID = 1285 Код = F AcctID = 8560077531775179 [12/Sep/2016: 18:23:59] VendorID = 1153 код = D acctID = 4433276107716482

где дата, VendorID, код и порядок acctID о появлении полей не изменяется или новый элемент не добавляется к нему, тогда фильтр (приведенный ниже) в файлах конфигурации работает хорошо.

\[%{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME}\] VendorID=%{INT:VendorID} Code=%{WORD:Code} AcctID=%{INT:AcctID} 

Предположим, что изменения порядка, как в примере, приведенном ниже, или если новый элемент добавляется к одному из журналов линий, то grokparsefailure происходит.

[12/Сен/2016: 18: 23: 07] VendorID = 5037 Код = С AcctID = 5317605039838520
[12/Сен/2016: 18: 23: 22] VendorID = 9108 Код = А AcctID = 2194850084423218 [12/Sep/2016: 18: 23: 49] VendorID = 1285 Код = F AcctID = 8560077531775179 [12/Sep/2016: 18: 23: 59] VendorID = 1153 Код = D AcctID = 4433276107716482 [ 12/Sep/2016: 18: 24: 50] AcctID = 3168124750473449 VendorID = 1065 Код = L [12/Sep/2016: 18: 24: 50] AcctID = 3168124750473449 VendorID = 1065 Код = L [12/Sep/2016: 18: 24: 50] AcctID = 3168124750473449 VendorID = 1065 Код = L

Здесь, в примере, последние три строки журнала отличаются от первых четырех строк журнала в порядке появления полей. И из-за этого сообщение фильтра с шаблоном grok не могло разобрать ниже трех строк, поскольку оно написано для первых четырех строк.

Как я должен обрабатывать этот сценарий, когда я сталкиваюсь с этим случаем? Пожалуйста, помогите мне решить эту проблему. Также укажите любую ссылку на любой документ для подробного объяснения с примерами.

спасибо, что заранее.

+1

извлечь часть после даты, а затем использовать Kv фильтр. Или используйте несколько шаблонов grok. – baudsp

ответ

0

Как правильно указано baudsp, это может быть достигнуто несколькими фильтрами grok. KV фильтр кажется более хорошим вариантом, но как для Grok, это одно решение:

input { 
    stdin {} 
} 

filter { 

    grok { 
     match => { 
       "message" => ".*test1=%{INT:test1}.*" 
     } 
    } 

    grok { 
     match => { 
       "message" => ".*test2=%{INT:test2}.*" 
     } 
    } 


} 
output { 
    stdout { codec => rubydebug } 
} 

Имея 2 разных Grok применения фильтра, мы можем игнорировать порядок бревен, поступающих в указанном Узоры в основном делают. не заботятся о том, что происходит до или после String test, а скорее просто автономно соответствуют их соответствующим шаблонам.

Таким образом, для этих 2-х строк:

test1=12 test2=23 
test2=23 test1=12 

вы получите правильный выход.Тест:

[email protected]:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf_grok_ordering/ 
Settings: Default pipeline workers: 8 
Pipeline main started 
test1=12 test2=23 
{ 
     "message" => "test1=12 test2=23", 
     "@version" => "1", 
    "@timestamp" => "2016-12-21T16:48:24.175Z", 
      "host" => "pandaadb", 
     "test1" => "12", 
     "test2" => "23" 
} 
test2=23 test1=12 
{ 
     "message" => "test2=23 test1=12", 
     "@version" => "1", 
    "@timestamp" => "2016-12-21T16:48:29.567Z", 
      "host" => "pandaadb", 
     "test1" => "12", 
     "test2" => "23" 
} 

Надежда, что помогает

+0

Спасибо, ребята. Позвольте мне работать с решением, которое вы, ребята, дали, и позвольте мне вернуться к вам, если вам нужна помощь. – VijayKarthikeyan

+0

gentlemen, это хорошо работает, если строка журнала имеет пары Key-Value ... Но что, если строки имеют как это ... «IPAddress программы даты номер_порт сообщение дата IPAddress программы ProcessID номер_порт сообщение» @pandaadb – VijayKarthikeyan

+0

это работает точно так же, только с другим рисунком. Вы можете разработать свои шаблоны здесь (используя grok, как я продемонстрировал выше). Они по существу являются просто регулярными выражениями, и пока ваш журнал хорошо определен (например, не каждый журнал имеет совершенно другой шаблон), вы можете их развить и применить к своим журналам. Вы можете проверить свои шаблоны здесь: http://grokdebug.herokuapp.com/ – pandaadb

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