在linux命令行中使用命令man 3 syslog
,我们可以看到函数介绍如下:
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
我们可以发现这些函数的返回值是'void',那么如何知道像“syslog(...)”这样的函数是否被成功调用?如果你在centos上停止rsyslog服务,你也可以运行以下程序而不会出现错误:
#include <syslog.h>
int main(int argc, char *argv[])
{
openlog("testsyslog", LOG_CONS | LOG_PID, LOG_LOCAL3);
syslog(LOG_USER | LOG_INFO, "syslog test message generated in program %s(=======from test!) \n", argv[0]);
closelog();
return 0;
}
根据手册,
openlog()的option参数是以下任何一个的OR:
LOG_CONS如果在发送到系统记录器时出错,则直接写入系统控制台。 ...
因此,如果指定LOG_CONS并且输出来自控制台,则意味着无法在syslog中记录消息。
您不知道这些syslog函数调用是否成功。原因是syslog
调用只发送一个网络数据包到syslogd
(或与rsyslogd
兼容的syslogd
),它既是Unix域套接字又是UDP套接字服务器。 syslogd
守护进程没有回应。所以如果像丢包一样失败,你就不知道了。我相信这是为了使日志机制尽可能简单,以避免不必要的日志记录开销。