У меня есть записи в журнале, которые выглядят так...
2014-02-25 00:00:03,936 INFO - something happened...bla bla bla
2014-02-25 00:00:03,952 INFO - ***Request Completed*** [ 78.002] mS [http://cloud.mydomain.local/schedule/search?param=45]
2014-02-25 00:00:04,233 INFO - something else happened...bla bla bla
У меня есть фильтр grok, который правильно анализирует строки...
grok {
match => [ "message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}" ]
}
Я хотел бы проанализировать дополнительные данные из «тела», если «тело» начинается с «***Запрос выполнен***». А именно 'elaspsedms' и 'uri'. Как я могу это сделать?
В другом месте было предложено добавить еще одну запись сообщения в фильтр grok, как это...
grok {
match => [
"message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- \*\*\*Request Completed\*\*\* \[%{SPACE}%{NUMBER:elaspedms}\] mS \[%{URI:uri}\]",
"message", "%{TIMESTAMP_ISO8601:logdate} %{WORD:severity}%{SPACE}- %{GREEDYDATA:body}"
]
}
... это работает, но для временных линий значение 'body' НЕ устанавливается. В идеале я бы хотел, чтобы тело всегда содержало последнюю часть записи, и если запись представляет собой временную линию, выполняйте дополнительный анализ elapsedms и uri.
Любые идеи, как я могу это сделать?
Есть ли средства для анализа полей? Так что я мог бы попытаться разобрать «тело» в elapsedms/uri, если это не удастся, продолжить. Или есть способ вложить совпадения полей в выражение grok?
Мысли?
Изменить: вместо того, чтобы всегда устанавливать «тело», могу ли я просто создать тело из «эласпедмс» и «ури», если установлено «эласпедмс»?