再会;
我需要测试日志管理堆栈的数据库查询性能,为此,我需要生成大量似乎是六个月前的日志消息并将它们发送到 rsyslogd。
这可能吗?如果是,请告诉我怎么做。
如果这个问题有什么问题,请提前道歉,我是新手。
我非常感谢您提供的任何帮助。
答案1
批量数据库加载
一种方法是将记录批量加载到日志系统数据库中。这可能比必须生成自定义系统日志记录并希望保留发送者的时间戳而不是系统日志守护程序发明的时间戳更容易。此外,数据库批量加载应该比发送和解析大量系统日志消息更有效。
缺点:可能无法直接访问数据库,上传错误可能会删除或破坏现有记录等。
接口上传
日志系统可能有API。这可能比直接数据库上传效率低,但确实避免了删除整个数据库的风险。请参阅日志系统的文档以了解如何使用它(如果存在)。
本机系统日志发送
否则 [RFC 3164] 在其本地环境中观察 syslog 协议;可能有现成的代码可用,但此类代码可能不提供伪造时间戳的能力,具体取决于实现(既不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 了解其工作原理。