#syslog
#системный журнал
Вопрос:
все эксперты,
Я пишу свой собственный демон, который имеет функцию, аналогичную стандартной syslogd. Ниже приведен мой код c для отправки сообщения журнала на удаленный сервер syslogd 10.0.0.3. Удаленный сервер syslogd 10.0.0.3 — это компьютер с Windows, и я запускаю там диспетчер служб системного журнала Kiwi (загруженный из Интернета). Сервер системного журнала Kiwi может получать сообщения журнала, которые я отправил, но сообщения, которые он показывает, либо пусты, либо содержат только один символ (последний столбец — это сообщение):
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 в коде, но это должно быть одно из этих 3.
Может ли какой-нибудь эксперт сказать мне, почему полученное сообщение не соответствует действительности? Большое спасибо!
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 closern";
CGR_INT socketFileDescriptor = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in sockServerAddr;
memset(amp;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 *)amp;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:
Правильное сообщение системного журнала имеет следующий формат:
<30>Oct 12 12:49:06 host app[12345]: syslog msg
Число в знаках <> является приоритетом, который состоит из значений серьезности и удобства. Также в сообщении отсутствует имя хоста. Это может быть причиной, по которой серверу системного журнала не удается проанализировать ваше сообщение. Для UDP не требуется прерыватель строки r n. Подробности см. в rfc3164.
Код также содержит ошибки, вы должны использовать strlen(pLogMessage) вместо sizeof(pLogMessage).
Комментарии:
1. это очень полезно. Спасибо. это заставило меня прочитать документы системного журнала и убедиться, что мой формат правильный