如何知道 syslog 的某个功能是不是调用成功?

Posted

技术标签:

【中文标题】如何知道 syslog 的某个功能是不是调用成功?【英文标题】:how to know if a function of syslog called successfully?如何知道 syslog 的某个功能是否调用成功? 【发布时间】:2018-01-16 02:15:42 【问题描述】:

在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;   

【问题讨论】:

使用perror()perror("syslog") 但是如果我停止rsyslog的服务,我会从perror得到success 【参考方案1】:

按照说明书,

openlog() 的选项参数是以下任何一个的 OR:

LOG_CONS 如果出现错误,则直接写入系统控制台 发送到系统记录器。 ...

因此,如果您指定 LOG_CONS 并且输出出现在控制台上,则意味着该消息无法记录在 syslog 中。

【讨论】:

我知道消息记录在哪里,但我想知道消息是否真正记录在我的代码中。当我在我的centos中尝试时,我无法判断消息是通过errno还是perror()记录的。【参考方案2】:

你不知道那些 syslog 函数调用是否成功。原因是syslog 调用只是将单个网络数据包发送到syslogd(或与syslogd 兼容的rsyslogd),它既是Unix 域套接字又是UDP 套接字服务器。 syslogd 守护进程没有响应。因此,如果出现丢包等故障,您不知道。我相信这是设计使日志机制尽可能简单以避免不必要的日志记录开销。

【讨论】:

以上是关于如何知道 syslog 的某个功能是不是调用成功?的主要内容,如果未能解决你的问题,请参考以下文章

你怎么知道 syslog-ng 是不是停止了你的监听守护进程?

syslog的接收日志

php5.2版本如何成功调用腾讯云短信API,实现短信发送功能

Glassfish 到 Syslog

怎样知道某个应用程序调用哪些dll文件?

如何在windows服务器中使用syslog功能