Отображение специального символа в журнале json с помощью syslog-ng - PullRequest
0 голосов
/ 20 апреля 2020

Раньше я обрабатывал свой журнал с помощью 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

1 Ответ

0 голосов
/ 22 апреля 2020

Это потому, что в конце файла стоит '\ n'?

Да, unix-stream() использует \n для разделения сообщений. Вы должны экранировать свое сообщение в промежуточном программном обеспечении.


В качестве альтернативы вы можете использовать, например, unix-dgram() с flags(no-parse). В этом случае вам может потребоваться отправить данные в сокет SOCK_DGRAM, но на Linux syslog() фактически основан на dgram.

Из руководства glib c:

openlog может открывать или не открывать сокет / dev / log, в зависимости от опции. Если это так, он пытается открыть его и подключить как потоковый сокет. Если это не сработает, он попытается открыть его и подключить как датаграмму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...