Syslog-Ng

在使用 syslog-ng 通過網路發送日誌之前設置宏

  • November 21, 2019

我創建了一個系統日誌伺服器和客戶端。我想在發送到伺服器的所有日誌中的源宏中設置客戶端序列號,以便在伺服器端我可以檢索宏並可以根據客戶端序列號創建日誌文件。以下是我的重寫規則:

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 syslog 協議轉發消息。下的所有子鍵.SDATA都將自動序列化到轉發的消息中。

  1. syslog-ng >= v3.17 有一個專用的源/目標外掛,它以特殊格式在 syslog-ng 實例(包含所有名稱-值對)之間“整體”傳輸消息。源對象和目標對像都被稱為ewmm()企業範圍的消息模型)。
  2. 作為替代方案,您可以使用$HOSTwith (keep-hostname(yes)在伺服器端),它是消息頭的一部分。

引用自:https://serverfault.com/questions/992059