2015-01-22 4 views
2

У меня есть logstash, kibana и elasticsearch установлен на моей системе, при такой конфигурации фильтра:нужны пользовательские поля журнала Копание ГРОК фильтра в logstash

filter{ 
if [type] == "syslog" { 
    grok { 
     match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" } 
     add_field => [ "received_at", "%{@timestamp}" ] 
     add_field => [ "received_from", "%{host}" ] 
    } 
    mutate { 
      add_field => { 
          "timestamp" => "%{TIME} %{MONTH} %{monthday}" 
         } 
     } 

    syslog_pri { } 
    date { 
     match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] 
    } 
    } 
} 

и получать выход на kibana как: Kibana output

но мне нужны некоторые поля, которые заключаются в следующем: @timestamp @version _id _index _type _file Уровень протокола Имя хоста Host IP Время Имя Процесс Ответ

Я попытался добавить Timestamp, но его печать же строку Intead из dyamic результата

Kibana output

Может кто-нибудь сказать мне, где я делаю ошибку.

ответ

0

Вы вводите в заблуждение образцы с полями.

Образец - это короткое обозначение, которое представляет собой регулярное выражение, такое как% {WORD} как ярлык для "\ b \ w + \ b".

Поле, в котором хранятся данные, в том числе информация, соответствующая шаблонам. Можно поместить шаблон в такое поле:% {WORD: my_field}

В вашем grok {} вы сопоставляетесь с:% {SYSLOGTIMESTAMP: syslog_timestamp}, который помещает все, что было сопоставлено в одно поле, называемое syslog_timestamp. Это месяц, месяц и время, просматриваемые в сообщениях syslog.

Хотя SYSLOGTIMESTAMP сам определяется как «% {MONTH} +% {MONTHDAY}% {TIME}", они не имеют синтаксиса ": name", поэтому для месяцев MONTH, MONTHDAY и ВРЕМЯ.

Предполагая, что вы действительно хотите, чтобы сделать новое поле в формате, который вы описали, вы должны либо:

  1. сделать новый шаблон, чтобы заменить все SYSLOGTIMESTAMP что бы поле из ряда части информации.
  2. используйте существующий шаблон для создания поля syslog_timestamp, как вы делаете, и затем grok {}, который с простым шаблоном разбивает его на части.

Я бы рекомендовал # 2, так что вы в конечном итоге с чем-то вроде этого:

grok { 
     match => { "syslog_timestamp" => "%{MONTH:month} +%{MONTHDAY:monthday} %{TIME:time}" } 
} 

Это должно сделать это.

Обратите внимание, что ваше поле будет строкой, поэтому оно не будет использоваться в запросах диапазона и т. Д. Вы должны использовать фильтр даты {}, чтобы заменить @timestamp на вашу информацию syslog_timestamp.

Удачи.

+0

ok Я получил его, но как отображать поля, связанные с уровнем журнала, клиентом IP, именем процесса и т. Д. – Lavish

+0

Если есть больше информации, чтобы вытащить из журналов, вы бы сделали больше grok {} stanzas, создав шаблоны, которые соответствуют и создайте нужные поля. –