用c++向远程rsyslog发送消息

send a message to a remote rsyslog in c++

本文关键字:消息 rsyslog c++      更新时间:2023-10-16

是否有办法在c++代码中发送消息到远程syslog ?

相当于Linux中的这行命令:

nc -w0 -u 192.168.1.1 514 <<< "logging from remote"

这段代码应该用套接字做一些事情,但它没有工作。

int main(int argc, char *argv[])
{
int listenfd = 0, connfd = 0,n;
struct sockaddr_in serv_addr;
    struct hostent *server;

char sendBuff[1025];
sprintf(sendBuff,"bla bla");
time_t ticks; 
listenfd = socket(AF_INET, SOCK_DGRAM , 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff)); 
serv_addr.sin_family = AF_INET;
server = gethostbyname("192.168.1.108");
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
//serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(514); 
    if ((n=connect(connfd,(const sockaddr*)&serv_addr,sizeof(serv_addr))) < 0){
            printf(" Connection to has failed Server ");
    }

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 
listen(listenfd, 10); 
while(1)
{
    connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 
    write(connfd, sendBuff, strlen(sendBuff)); 
    close(connfd);
    sleep(60);
}

}

在一些unix(包括Linux)上,您可以简单地使用客户机命令http://linux.die.net/man/3/syslog并安装当前的syslog服务器,例如syslog-ng。该服务器不仅可以根据您的规则过滤消息,还可以将它们发送到任何远程syslog。

如果你是在Windows上,恐怕你必须实现你自己的syslog协议。幸运的是,它没有那么难,或多或少地定义了。

nc -u仅通过UDP套接字发送数据。没有什么特别的,没有特定的协议要遵循:它只是原始数据。你可以简单地在c++中通过UDP套接字发送消息(参见socketAF_INET, SOCK_DGRAM参数和其他相关函数)。

但是这意味着你错过了很多syslog的特性,比如设施和优先级。

@Moose是正确的:syslog API更符合你的需求,因为它更灵活(如果你想改变行为,不需要修改你的程序,你只需要重新配置syslog守护进程)。