使用我自己的c代码将日志消息发送到远程syslogd服务器

时间:2011-10-11 19:33:56

标签: syslog

所有专家,

我正在编写自己的守护进程,它具有与标准syslogd类似的功能。下面是我的c代码,用于向远程syslogd服务器10.0.0.3发送日志消息。远程syslogd服务器10.0.0.3是一台Windows机器,我在那里运行Kiwi Syslog Service Manager(从Internet下载)。 Kiwi syslog服务器可以接收我发送的日志消息,但它显示的消息为空或只有一个字符(最后一列是消息):

10-11-2011  14:21:01    User.Emerg      10.0.0.1    O
10-11-2011  14:21:00    User.Emerg      10.0.0.1    T
10-11-2011  14:21:01    User.Warning    10.0.0.1

我不知道代码中哪个与我的pLogMessage完全对应,但它必须是这三个中的一个。

任何专家都可以告诉我为什么收到的信息不正确吗?非常感谢!

char *pLogMessage = "Tue Oct 11 11:14:20 2011:cli:journal:LOG_INFO: cgr_cli_main.c:232--his books are all jammed in the close\r\n";

CGR_INT socketFileDescriptor = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

struct sockaddr_in sockServerAddr;
memset(&sockServerAddr, 0, sizeof(struct sockaddr_in));
sockServerAddr.sin_family         = AF_INET;
sockServerAddr.sin_addr.s_addr    = inet_addr("10.0.0.3");  /* remote syslogd server ip */     
sockServerAddr.sin_port           = htons(514);      

/* send the log message to the socket */
size_t bytesSent = sendto(socketFileDescriptor, /* socket file descriptor */
    pLogMessage, /* message to be sent */
    sizeof(pLogMessage), /* message size in bytes */    
    0, /* flag: ? */
    (struct sockaddr *)&sockServerAddr, /* points to a sockaddr structure containing the destination address */
    sizeof(sockServerAddr)); /* specifies the length of the sockaddr structure pointed to by the previous argument */

/* close socket */
close(socketFileDescriptor);

1 个答案:

答案 0 :(得分:4)

正确的系统日志消息具有以下格式:

<30>Oct 12 12:49:06 host app[12345]: syslog msg

&lt;&gt;中的数字标志是由严重性和设施值组成的优先级。此外,您还缺少邮件中的主机名。这可能是系统日志服务器无法解析您的邮件的原因。 UDP不需要行终止符\ r \ n。有关详细信息,请参阅rfc3164。

代码也有问题,您应该使用strlen(pLogMessage)而不是sizeof(pLogMessage)。