所有专家,
我正在编写自己的守护进程,它具有与标准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);
答案 0 :(得分:4)
正确的系统日志消息具有以下格式:
<30>Oct 12 12:49:06 host app[12345]: syslog msg
&lt;&gt;中的数字标志是由严重性和设施值组成的优先级。此外,您还缺少邮件中的主机名。这可能是系统日志服务器无法解析您的邮件的原因。 UDP不需要行终止符\ r \ n。有关详细信息,请参阅rfc3164。
代码也有问题,您应该使用strlen(pLogMessage)而不是sizeof(pLogMessage)。