Linux
為 syslog RFC5424 生成偽造的舊日誌消息,例如六個月前(偽造的時間戳)
再會;
我需要測試我的日誌管理堆棧的數據庫查詢性能,為此,我需要生成大量似乎已有六個月的日誌消息並將它們發送到 rsyslogd。
這甚至可能嗎?如果是,請告訴我如何。
如果這個問題有任何問題,請提前道歉,我是新手。
我非常感謝您能提供的任何幫助。
批量數據庫載入
一種方法是將記錄批量載入到日誌系統數據庫中。這可能更容易生成自定義 syslog 記錄並希望保留發送者的時間戳,而不是 syslog 守護程序發明的時間戳。此外,數據庫批量載入應該比發送和解析大量系統日誌消息更有效。
缺點:可能無法直接訪問數據庫,錯誤的上傳可能會失去或破壞現有記錄等。
API 上傳
日誌系統可能有一個 API。這可能比直接上傳數據庫效率低,但確實避免了刪除整個數據庫的風險。請查閱日誌系統的文件以了解如何使用它(如果存在)。
本機系統日誌發送
否則
$$ RFC 3164 $$在其原生棲息地觀察系統日誌協議;可能有現成的程式碼可用,儘管此類程式碼可能不提供偽造時間戳的能力,具體取決於實現(既不
logger(1)
提供syslog(3)
明顯的方式來偽造時間戳,Net::Syslog
Perl 模組等也不提供)。另一方面,使用自定義時間戳偽造消息並不難:#include <sys/socket.h> #include <sys/types.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define SYSLOGMAX 1024 char buf[SYSLOGMAX]; struct addrinfo hints; int mkcon(const char *host, const char *serv, const struct addrinfo *hints); int main(void) { hints.ai_socktype = SOCK_DGRAM; int server = mkcon("192.168.99.101", "syslog", &hints); for (size_t i = 0; i < 4; i++) { // this is the older [RFC 3164] form, which is simpler sprintf(buf, "<%d>Jan 11 12:13:14 host program[123]: blah%lu", (21 << 3) | 4, i); send(server, buf, SYSLOGMAX, 0); // network admins or logging services might get unhappy // if the packets or log messages show up too quick usleep(100000); } return 0; } int mkcon(const char *host, const char *serv, const struct addrinfo *hints) { struct addrinfo *peer; // TODO needs better error handling and better use of the // peer struct, etc int ret = getaddrinfo(host, serv, hints, &peer); if (ret != 0) abort(); int server = socket(peer->ai_family, peer->ai_socktype, peer->ai_protocol); if (server == -1) abort(); if (connect(server, peer->ai_addr, peer->ai_addrlen) == -1) abort(); freeaddrinfo(peer); return server; }
您可能能夠指出這一點,
/dev/log
這可能比通過網路發送數據包更有效且損耗更少。現代 syslog 守護程序也可能支持更可靠的 TCP 流。檢查文件或相關 RFC 以了解其工作原理。