Раньше я обрабатывал свой журнал с помощью Syslog. В настоящее время я пытаюсь переключиться на syslog-ng, а также обновить формат моего журнала, чтобы он соответствовал JSON стандарту.
Сначала я определил файл конфигурации syslog-ng:
@version: 3.2X
filter f_middleware {
facility("local1");
};
template t_json_filetemplate {
template("{\"timestamp\":\"${ISODATE}\",${MESSAGE}\n");
};
source s_kernel {
file("/proc/kmsg" program_override("kernel"));
};
source s_middleware {
unix-stream("/dev/log");
};
destination d_kernel {
file("/data/logs/kern.log");
};
destination d_middleware {
file("/data/logs/middleware.log", template(t_json_filetemplate));
};
log {
source(s_kernel);
destination(d_kernel);
};
log {
source(s_middleware);
filter(f_middleware);
destination(d_middleware);
};
В моем коде промежуточного программного обеспечения c я
openlog("middleware", 0, LOG_LOCAL1);
Я форматирую свой журнал с помощью макроса в моем коде для обработки ожидаемого формата json с моего пользовательского сервера:
#ifdef DEBUG
#define _PRINT_DEBUG(M, ...) \
do { \
syslog(LOG_DEBUG, "\"category\":\"%s\",\"level\":\"DEBUG\",\"message\":\"" M "%s\"}\n", __DIR__, __VA_ARGS__); \
} while (0)
#else
Проблема в том, что если я попытался отобразить содержимое файла с помощью Syslog, конец сообщения будет обрезан. конечно, он работает правильно для других типов сообщений.
Вот например, я пытаюсь напечатать содержимое файла / proc / cmdline
{"timestamp":"2020-04-20T16:55:50+02:00","category":"XXX_MANAGER","level":"DEBUG","message":"root ptr : root=/dev/xxx
'} ' отсутствует в конце. Это потому, что в конце файла есть ' \ n '?
Я также попытался добавить кое-что о побеге в моем конфигурационном файле:
destination d_middleware {
file("/data/logs/middleware.log", template("{\"timestamp\":\"${ISODATE}\",${MESSAGE}\n") template-escape(no));
Нет лучшего результата ...
Предположение, что я использую syslog-ng плохим способом ...
Более полное объяснение проблемы после некоторого расследования https://lists.balabit.hu/pipermail/syslog-ng/2020-April/025836.html