2015-02-26 2 views
9

У меня есть Друпала сторожевой системный журнал файл, который я хочу, чтобы разобрать на по существу два вложенные полеи, системный журнал часть и часть сообщения, так что я получаю этот результатимеют Grok фильтр создавать вложенные поля в результате

syslogpart: { 
    timestamp: "", 
    host: "", 
    ... 
}, 
messagepart:{ 
    parsedfield1: "", 
    parsedfield2: "", 
    ... 
} 

Я попытался сделать пользовательский шаблон, который выглядит следующим образом:

DRUPALSYSLOG (%{SYSLOGTIMESTAMP:date} %{SYSLOGHOST:logsource} %{WORD:program}: %{URL:domain}\|%{EPOCH:epoch}\|%{WORD:instigator}\|%{IP:ip}\|%{URL:referrer}\|%{URL:request}\|(?<user_id>\d+)\|\|)

, а затем запустить match => ['message', '%{DRUPALSYSLOG:drupal}'}

, но я не получаю вложенный ответ, я получаю текстовый блок drupal: "ALL THE MATCHING FIELDS IN ONE STRING", а затем все совпадения отдельно, но не вложенные под drupal, а на том же уровне.

ответ

9

Да, это ожидается. Я не думаю, что есть способ создать вложенные поля с grok. Я подозреваю, что вам нужно будет использовать mutate filter, чтобы переместить их на место.

mutate { 
    rename => { 
     "date" => "[drupal][date]" 
     "instigator" => "[drupal][instigator]" 
     ... 
    } 
    } 

Если у вас есть много полей, это может быть более удобно использовать ruby filter. Это особенно верно, если вы префиксные поля Drupal, например. «Друпал.» - тогда вы должны написать фильтр, чтобы переместить все поля с этим префиксом в подполе с тем же именем.

+1

Синтаксис кронштейн поддерживается непосредственно в определении шаблона. Не нужно мутировать/переименовывать! См. Ответ Жюльена ниже. –

9

На самом деле, вы можете сделать что-то подобное в шаблоне конфигурации

%{WORD:[drupal][program]} 

Это создаст объект JSON как

drupal:{ 
    program: "..." 
} 
+0

Гораздо проще, чем принятый ответ. –

+0

Да, это работает, если вы хотите создать подполя '@ metadata' (или, предположительно, другие поля с необычными символами в имени). –