在c ++中向远程rsyslog发送消息

时间:2013-06-12 13:22:05

标签: c++ linux rsyslog

有没有办法用c ++代码向远程syslog发送消息?

相当于linux命令中的这一行:

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

这段代码应该用socket执行某些操作,但它不起作用。

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);
}

}

2 个答案:

答案 0 :(得分:4)

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

如果你在Windows上,我担心你必须实现自己的syslog协议。幸运的是,它并没有那么困难,或多或少都有定义。

答案 1 :(得分:1)

nc -u只通过UDP套接字发送数据。没有什么特别的,没有特定的协议可以遵循:它只是原始数据。您只需通过C ++中的UDP套接字发送消息(请参阅socket AF_INET, SOCK_DGRAM参数和其他相关函数)。

但这意味着你错过了许多系统日志的功能,如设施和优先级。

@Moose是对的:syslog API与您的需求更相关,因为它更灵活(如果您想要更改行为,则无需修改程序,您只需要重新配置syslog守护进程)。