Ошибка синтаксического анализа Grok при анализе нескольких строковых сообщений

Я пытаюсь выяснить шаблон grok для анализа нескольких сообщений, таких как трассировка исключений, и ниже приведен один такой журнал.

2017-03-30 14:57:41 [12345] [qtp1533780180-12] ERROR com.app.XYZ - Exception occurred while processing
java.lang.NullPointerException: null
        at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162)
        at spark.webserver.JettyHandler.doHandle(JettyHandler.java:61)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)
        at org.eclipse.jetty.server.Server.handle(Server.java:517)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:302)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:245)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
        at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
        at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
        at java.lang.Thread.run(Thread.java:745)

Вот мой logstash.conf

    input {
  file {
    path => ["/debug.log"]
    codec => multiline {
      # Grok pattern names are valid! :)
      pattern => "^%{TIMESTAMP_ISO8601} "
      negate => true
      what => previous
    }
  }
}

filter {

  mutate {
    gsub => ["message", "r", ""]
  }
  grok {
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%{NOTSPACE:uid}\] \[%{NOTSPACE:thread}\] %{LOGLEVEL:loglevel} %{DATA:class}\-%{GREEDYDATA:message}" ]
    overwrite => [ "message" ]
  }
  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss" ]
  }
}


output {
  elasticsearch { hosts => localhost }
  stdout { codec => rubydebug }
}

Это отлично работает для анализа однострочных журналов, но не работает в

0] "_grokparsefailure"

для многострочных трассировок исключений

Может ли кто-нибудь предложить мне правильный шаблон фильтра для анализа многострочных журналов?


person Aarish Ramesh    schedule 30.03.2017    source источник


Ответы (2)


Если вы работаете с многострочными журналами, используйте многострочный фильтр, предоставляемый logstash. Сначала нужно отличить начало новой записи в многострочном фильтре. Из ваших журналов я вижу, что новая запись начинается с «TIMESTAMP», ниже приведен пример использования.

Пример использования ::

filter {
  multiline {
    type => "/debug.log"
    pattern => "^%{TIMESTAMP}"
    what => "previous"
 }
}

Затем вы можете использовать Gsub для замены "\n" и "\r", которые будут добавлены многострочным фильтром в вашу запись. После этого используйте Грока.

person Darpan Sanghavi    schedule 31.03.2017
comment
Я попытался сделать это, и теперь я получаю следующую ошибку. Не удается загрузить неверную конфигурацию {:reason=>Не удалось найти плагин фильтра с именем «многострочный». Вы уверены, что это правильно? Попытка загрузить подключаемый модуль многострочного фильтра привела к этой ошибке: Проблемы с загрузкой запрошенного подключаемого модуля с именем multiline of type filter. Ошибка: NameError NameError} - person Aarish Ramesh; 31.03.2017
comment
@Aarish :: Это зависит от того, какую версию Elastic/Logstash вы используете. Для последних версий вам необходимо использовать Multiline во вводе. Ссылка для справки: elastic.co/guide/en/ logstash/текущий/ - person Darpan Sanghavi; 31.03.2017
comment
Я исправил это, установив многострочный кодек, и у меня есть logstash.conf выше. Даже тогда я получаю ошибку синтаксического анализа grok. Не могли бы вы проверить и сообщить мне, в чем ошибка? - person Aarish Ramesh; 31.03.2017

Приведенная выше конфигурация logstash работала нормально после удаления

mutate { gsub => ["сообщение", "r", ""] }

Итак, рабочая конфигурация logstash для анализа однострочных и многострочных входных данных для приведенного выше шаблона журнала.

input {
  file {
    path => ["./debug.log"]
    codec => multiline {
      # Grok pattern names are valid! :)
      pattern => "^%{TIMESTAMP_ISO8601} "
      negate => true
      what => previous
    }
  }
}

filter {
  grok {
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%{NOTSPACE:uid}\] \[%{NOTSPACE:thread}\] %{LOGLEVEL:loglevel} %{DATA:class}\-%{GREEDYDATA:message}" ]
    overwrite => [ "message" ]
  }
  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss" ]
  }
}


output {
  elasticsearch { hosts => localhost }
  stdout { codec => rubydebug }
}
person Aarish Ramesh    schedule 17.04.2017