c - 带有格式化错误跟踪的日志宏

标签 c linux error-handling macros

我目前正在尝试为作为守护进程运行的程序定义日志宏。

因为它是一个守护进程,我将 stdout 和 stderr 都重定向到一个特定的文件。这一步没问题,我有两个用于记录的宏写入同一个文件。

define LOG(fmt, args...)        fprintf(stdout, fmt, ## args); \
                                fflush(stdout)

#define LOG_ERR(fmt, args...)   fprintf(stderr, fmt, ## args);

我的意思是我想要一个“类似错误”的跟踪:

<Message with arguments> : <errno associated message>

所以我搜索了一下,如果我将 LOG_ERR 修改为:

#define LOG_ERR(fmt, args...)   fprintf(stderr, fmt, ## args); \
                                perror("")

它可以工作,但是 errno 关联的消息是在一个\n 字符之后发送的(我认为是因为 stderr 被缓冲了) 所以我得到:

<Message with arguments>
<errno associated message>

另一个解决方案可能是使用 strerror 函数作为最后一个参数,但我真的不知道是否可以这样做。 它看起来像:

#define LOG_ERR(fmt, args...)   fprintf(stderr, fmt, ## args, strerror(errno));

但是这个解决方案也失败了,因为没有插入 errno 标志,甚至没有写行尾字符。

有人知道我如何在不使用函数的情况下实现它吗?

最佳答案

感谢您的建议,我成功地完成了我想做的事情。

按照 Bjorn 的建议,我改为使用 syslog 而不是 stderr 和 stdout。 Bjorn 你有更多关于为什么守护进程不应该使用 stderr 和 stdout 的信息吗?我很想知道原因。

我会给出我的解决方案,以防它对某人有用。

#define SYSLOG(fmt, args...)        syslog(LOG_NOTICE, fmt, ## args);
#define SYSLOG_ERR(fmt, args...)    syslog(LOG_ERR, fmt " : %s", ## args , strerror(errno));

不要忘记以前的

openlog("<program_name>", LOG_PID, LOG_DAEMON);

再次感谢;)

关于c - 带有格式化错误跟踪的日志宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45017109/

相关文章:

regex - 将 32 字节哈希值与 sed 匹配

python - urllib/urllib2 返回的错误码和实际页面

c - 在终止我的 TCP/IP 连接后使用 POSIX "write"函数会使我的应用程序崩溃 - 为什么?

c++ - 为什么使用指针交换值不起作用?

c - C程序。如何仅使用While循环来不允许任何字符,负int?

c - 是否需要使用 `O_NONBLOCK` 中的 `open()` 打开与 POSIX AIO 一起使用的文件描述符?

Android:在启动时挂载不同的用户数据分区

java - SPOJ上的Java错误

java - 可以通过空字符串错误匹配 “(…)+”中的javacc扩展

c - 如何检查pid是否属于当前用户 session ?