Назад | Перейти на главную страницу

Как писать логи в формате JSON?

Я хочу централизовать ведение журнала на своих серверах, используя 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, Роберт