2016-09-22 4 views
0

Я хотел бы собирать журналы нескольких серверов на одном узле старта. В качестве вывода я хотел бы сохранить один файл на сервер. В журналах я получил поле «source_host», которое указывает, какой сервер создал журнал.logstash generic output filename

В качестве вывода я хотел бы получить кучу файлов, названных «source_host». Хосты-источники часто меняются, поэтому мне нужна общая конфигурация

например. журналы, происходящие из сервера «foo», должны быть сохранены в/logs/foo и журналы с сервера «bar» in/logs/bar

Я пробовал конфигурацию, подобную этой, но файл получил имя «% {source_host}». При использовании% {host} файл получает имя хоста собирающего сервера.

output{ 
    file { 
    path => "/tmp/%{source_host}" 
    } 
} 
+0

Не могли бы вы разместить образец журнала и ваши фильтры? – fylie

+0

Я не использую фильтры (еще не). Пример журнала: '{" version ":" debug "," host ":" devel "," level ": 5," @ version ":" 1 "," @ timestamp ":" 2016-09-15T10: 41: 00.549Z "," source_host ":" foo "," message ":" testmsg "}' – Philipp

ответ

1

Моя конфигурация:

input { 
    tcp { 
    port => 5544 
    codec => json_lines 
    } 
} 

output{ 
    file { 
    path => "/tmp/%{source_host}" 
    } 
} 

выводит в файл/TMP/Foo с журн образца.

echo '{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z", "source_host":"foo","message":"testmsg"}' | nc localhost 5544 

EDIT: Вот мои результаты испытаний:

pancake$ echo '{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z", "source_host":"foo","message":"testmsg"}' | nc localhost 5544 
pancake$ cat /tmp/foo 
{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z","source_host":"foo","message":"testmsg","port":56716} 
pancake$ echo '{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z", "source_host":"bar","message":"testmsg"}' | nc localhost 5544 
pancake$ echo '{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z", "source_host":"bar","message":"one more message!"}' | nc localhost 5544 
pancake$ cat /tmp/bar 
{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z","source_host":"bar","message":"testmsg","port":56717} 
{"version":"debug","host":"devel","level":5,"@version":"1","@timestamp":"2016-09-15T10:41:00.549Z","source_host":"bar","message":"one more message!","port":56718} 

EDIT 2: Оо, я просто подумал о чем-то. Вы сказали ранее, что вы не используете какие-либо фильтры, верно? Вам нужно использовать какой-либо фильтр, иначе поле source_host не будет существовать. Если у вас есть codec => json_lines (потому что ваши журналы JSON) в вашем блоке ввода, как и в моем примере, он проанализирует ваши JSON в парах значений ключа. Если у вас нет фильтра или кодека, весь блок журнала будет сохранен в поле message без изменений. Попробуйте добавить входной кодек и посмотрите, поможет ли это.

+0

странно - я буду тестировать снова в понедельник – Philipp

+0

не работал, но я получил его работу с использованием выходного канала и небольшой скрипт bash. Положительный побочный эффект: журналы без исходного набора хостов не теряются – Philipp

+0

Хм, мне интересно, почему это не сработало. Какую версию Logstash вы используете? Я буду продолжать смотреть на него. – fylie

Смежные вопросы