Я создал сервер и клиент системного журнала. Я хочу установить серийный номер клиента в макросе 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
это нестандартное поле.
У вас есть несколько вариантов:
Вы можете указать пункт назначения template()
вручную, а затем проанализируйте сообщение на стороне сервера. Это можно сделать, например, в формате JSON ($(format-json)
и json-parser()
).
Вы можете использовать раздел структурированных данных сообщения системного журнала 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
будет автоматически сериализован в пересылаемое сообщение.
syslog-ng> = v3.17 имеет специальный плагин источника / назначения, который передает сообщения «целиком» между экземплярами syslog-ng (содержащими все пары имя-значение) в специальном формате. И исходный, и целевой объекты называются ewmm()
(корпоративная модель сообщений).
В качестве альтернативы вы можете использовать $HOST
с участием (keep-hostname(yes)
на стороне сервера), который является частью заголовка сообщения.