К сожалению, ваши предположения о том, что вы пытаетесь сделать, слегка отключаются, но мы можем это исправить!
Вы создали регулярное выражение для JSON, но вы не разбираете JSON. Вы просто разбираете журнал, который является bastardized syslog (см. SyslogStreamer в source), но на самом деле это не формат syslog (либо RFC 5424, либо 3164). После этого Logstash предоставляет выход JSON.
Давайте разложим сообщение, которое станет источником, который вы анализируете. Ключ вам нужно разобрать фронт сообщения назад.
Сообщение:
2017-02-15T14:55:24UTC deis-logspout[1]: 2017/02/15 14:55:24 routing all to udp://x.x.x.x:xxxx\n
2017-02-15T14:55:24UTC
: Отметка общая картина Grok. Это в основном следует TIMESTAMP_ISO8601, но не совсем.
deis-logspout[1]
: Это будет ваш источник logs, который вы можете назвать контейнером. Вы можете использовать шаблон grok URIHOST.
routing all to udp://x.x.x.x:xxxx\n
: Поскольку сообщение для большинства журналов содержится в конце этого сообщения, вы можете просто затем использовать шаблон ГРОК GREEDYDATA, который является эквивалентом .*
в регулярном выражении.
2017/02/15 14:55:24
: Еще одна временная метка (почему?), Которая не соответствует общим шаблонам grok.
С помощью фильтров grok вы можете сопоставить синтаксис (абстракция от регулярных выражений) к семантическому (имя для извлекаемого значения).Например, %{URIHOST:container}
Вы увидите, что я сделал несколько взломов фильтров grok, чтобы сделать форматирование. У вас есть соответствующие части текста, даже если вы не намерены фиксировать результаты. Если вы не можете изменить форматирование временных меток в соответствии со стандартами, создайте собственный шаблон.
Конфигурация:
input {
tcp {
port => 5000
type => deis
}
udp {
port => 5000
type => deis
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}(UTC|CST|EST|PST) %{URIHOST:container}\[%{NUMBER}\]: %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME} %{GREEDYDATA:msg}" }
}
}
output {
elasticsearch { hosts => ["foo.somehost"] }
}
Выход:
{
"container" => "deis-logspout",
"msg" => "routing all to udp://x.x.x.x:xxxx",
"@timestamp" => 2017-02-22T23:55:28.319Z,
"port" => 62886,
"@version" => "1",
"host" => "10.0.2.2",
"message" => "2017-02-15T14:55:24UTC deis-logspout[1]: 2017/02/15 14:55:24 routing all to udp://x.x.x.x:xxxx",
"timestamp" => "2017-02-15T14:55:24"
"type" => "deis"
}
Вы можете дополнительно мутировать пункт уронить @timestamp, @host и т.д., поскольку они предоставляются Logstash по умолчанию , Другое предложение - использовать date filter для преобразования любых временных меток, найденных в удобные форматы (лучше для поиска).
В зависимости от форматирования журнала вам может потребоваться слегка изменить шаблон. У меня был только один пример, чтобы уйти. Это также поддерживает исходное полное сообщение, потому что любые операции с полем, выполняемые в Logstash, являются разрушительными (они перезаписывают значения с полями с тем же именем).
Ресурсы:
Вы имеете в виду, добывающие ваше сообщение * * в четырех различных * поля * (части, как вы упомянули)? Вы сделали это уже, как я вижу из вывода ES ** ** выше. Так в чем ваш вопрос? Что касается подхода? – Kulasangar
Извините, если это было не кратким, я обновил вопрос. – user7565843