json-фильтр завершается ошибкой ›#‹NoMethodError: неопределенный метод `[]’ для nil:NilClass›

Я пытаюсь обработать записи из файла журнала, который содержит как простые сообщения, так и сообщения в формате json. Моя первоначальная идея состояла в том, чтобы найти сообщения, заключенные в фигурные скобки, и обработать их другим цепным фильтром. Grep работает нормально (как и простая обработка сообщений), но последующий фильтр json сообщает об исключении. Я прикрепил конфигурацию logstash, ввод и сообщение об ошибке ниже.

У вас есть идеи, в чем может быть проблема? Любые альтернативные предложения по обработке записей в формате простого и json из одного и того же файла?

Большое спасибо, Йоханнес

Сообщение об ошибке:

Trouble parsing json {:key=>"@message", :raw=>"{\"time\":\"14.08.2013 10:16:31:799\",\"level\":\"DEBUG\",\"thread\":\"main\",\"clazz\":\"org.springframework.beans.factory.support.DefaultListableBeanFactory\",\"line\":\"214\",\"msg\":\"Returning cached instance of singleton bean 'org.apache.activemq.xbean.XBeanBrokerService#0'\"}", :exception=>#<NoMethodError: undefined method `[]' for nil:NilClass>, :level=>:warn}

конфиг логсташа:

file {
        path => [ "plain.log" ] 
        type => "plainlog" 
        format => "plain" 
    }
}
filter {
  # Grep json formatted messages and send them to following json filter
  grep {
    type => "plainlog"
    add_tag => [ "grepped_json" ]
    match => [ "@message", "^{.*}" ]
  }
  json {
    tags => [ "grepped_json" ]
    source => "@message"
  }
}
output { 
  stdout { debug => true debug_format => "json"}
  elasticsearch { embedded => true }
}

Вход из файла журнала (всего одна строка):

{"time":"14.08.2013 10:16:31:799","level":"DEBUG","thread":"main","clazz":"org.springframework.beans.factory.support.DefaultListableBeanFactory","line":"214","msg":"Returning cached instance of singleton bean 'org.apache.activemq.xbean.XBeanBrokerService#0'"}

person jayeff    schedule 16.08.2013    source источник


Ответы (1)


У меня была та же проблема, и я решил ее, добавив target в фильтр json. В документации сказано, что target является необязательным, но, по-видимому, это не так.

Изменив свой пример, вы должны иметь:

json {
  tags => [ "grepped_json" ]
  source => "@message"
  target => "data"
}
person mimes70    schedule 04.09.2013
comment
Кстати, после ответа на это я заметил, что документация, на которую я ссылался, относится к версии 1.2.0. Я протестировал новую версию, и она больше не требует целевой - person mimes70; 05.09.2013