Пришла в голову идея добывать и хранить логи с большого зоопарка сетевого оборудования с помощью ELK.
Все шло отлично, пока не добрался до фильтров.
Вот пример моих логов:
23-Nov-2008 03:53:27 :%STP-W-PORTSTATUS: e1: STP status Forwarding
23-Nov-2008 03:53:24 :%LINK-W-Down: e1
23-Nov-2008 03:53:23 :%LINK-I-Up: e1
Вот такой получился фильтр.
filter {
if [type] == "ring" {
grok {
match => { "message" => "%{SYSLOGHOST:date} %{TIME:time} %{NOTSPACE:ID} %{BASE16FLOAT:port}%{GREEDYDATA:msg}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
Проверил его несколькими онлайн парсерами - идеально. На а на выводе kabana получаю tags_grokparsefailure.
Я полностью уверен что это именно фильтр, так как если я просто оставляю %{GREEDYDATA:msg} все прекрасно работает, но идет сплошным текстом.
И что делать, когда в логе появляются несколько отличающиеся события, например:
23-Nov-2008 03:53:26 :%AAA-I-CONNECT: User CLI session for user komarik over telnet , source 188.133.124.16 destination 192.168.0.1 ACCEPTED
Тут только весь вывод, начиная с номера порта, парсить как GREEDYDATA, что бы и такие сообщения парсились ?
Тыкните в ошибку, пожалуйста. Уж слишком долго над этим сижу.