Я хочу централизовать ведение журнала на своих серверах, используя syslog-ng
который запишет строку в формате JSON в файл, который, в свою очередь, будет получен logstash
, который отправит его elasticsearch
. Эта настройка работает, за исключением некоторых конкретных проблем с JSON.
Я форматирую в syslog-ng
журнал должен быть в JSON через destination
строфа:
destination d_json { file("/var/log/all_syslog_in_json.log" perm(0666) template("{\"@timestamp\": \"$ISODATE\", \"facility\": \"$FACILITY\", \"priority\": \"$PRIORITY\", \"level\": \"$LEVEL\", \"tag\": \"$TAG\", \"host\": \"$HOST\", \"program\": \"$PROGRAM\", \"message\": \"$MSG\"}\n")); };
Обычно это работает нормально, но иногда JSON оказывается искаженным из-за, например, существующих кавычек в $MSG
.
Есть ли способ лучше отформатировать сообщение? Я смотрел на встроенный json-parser
но похоже, что для ввода требуются пары ключ-значение, в то время как я хотел бы взорвать доступные поля в запись JSON
РЕДАКТИРОВАТЬ И РЕШЕНИЕ:
Я нашел на Блог Дастина Опреа точное решение:
destination d_json { file("/tmp/test.json" template("$(format-json --scope selected_macros --scope nv_pairs)\n")); };
поскольку вы хотите отформатировать сообщение как JSON, а не анализировать его, вам понадобится format-json () функция syslog-ng.
Кстати, последние версии syslog-ng может отправлять сообщения напрямую в Elasticsearch.
HTH, Роберт