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

Установите макрос перед отправкой журнала по сети с помощью syslog-ng

Я создал сервер и клиент системного журнала. Я хочу установить серийный номер клиента в макросе SOURCE во всех журналах, отправляемых на сервер, чтобы на стороне сервера я мог получить макрос и создать файл журнала на основе серийного номера клиента. Ниже приводится мое правило перезаписи:

rewrite set_host{
    set("DEVICE_SERIAL_NO", value("SOURCE"));

};

журнал {источник (s_src); перезаписать (set_host); пункт назначения (d_net); };

На стороне сервера я написал следующую конфигурацию для файла журнала:

destination d_host-specific {
    file("/var/log/testlogs/$SOURCE/$YEAR/$MONTH/$HOST-$YEAR-$MONTH-$DAY.log");

};

Но на стороне сервера я получаю значение $ SOURCE как s_net. Похоже, что макрос SOURCE перезаписан на стороне сервера. Как передать макрос от клиента к серверу и использовать его на стороне сервера?

$SOURCE является локальным значением, по умолчанию оно не пересылается на сервер. У каждого пункта назначения есть сетевой формат, например network() источник / назначение использует протокол системного журнала BSD (RFC 3164) или IETF (RFC 5424). Шаблон по умолчанию для этих протоколов содержит $PROGRAM, $MSG, $HOST, $ISODATEи т. д., но $SOURCE это нестандартное поле.

У вас есть несколько вариантов:

  1. Вы можете указать пункт назначения template() вручную, а затем проанализируйте сообщение на стороне сервера. Это можно сделать, например, в формате JSON ($(format-json) и json-parser()).

  2. Вы можете использовать раздел структурированных данных сообщения системного журнала RFC 5424:

# client

rewrite set_host {
  set("DEVICE_SERIAL_NO", value(".SDATA.example@32473.SOURCE"));
};

destination d_net {
  syslog("server.address");
};
# server

source s_net {
  syslog();
};

destination d_host_specific {
  file("/var/log/testlogs/${.SDATA.example@32473.SOURCE}/$YEAR/$MONTH/$HOST-$YEAR-$MONTH-$DAY.log");
};

В syslog() и network(flags(syslog-protocol)) адресаты пересылают сообщения с использованием протокола системного журнала IETF. Все подключи в .SDATA будет автоматически сериализован в пересылаемое сообщение.

  1. syslog-ng> = v3.17 имеет специальный плагин источника / назначения, который передает сообщения «целиком» между экземплярами syslog-ng (содержащими все пары имя-значение) в специальном формате. И исходный, и целевой объекты называются ewmm() (корпоративная модель сообщений).

  2. В качестве альтернативы вы можете использовать $HOST с участием (keep-hostname(yes) на стороне сервера), который является частью заголовка сообщения.