使用格式化的perror跟踪记录宏

时间:2017-07-10 16:21:05

标签: c linux error-handling macros

我正在尝试为作为deamon运行的程序定义日志宏。

因为它是一个守护,我将stdout和stderr重定向到一个特定的文件。这一步没关系,我有两个用于记录的宏,它写在同一个文件中。

<Message with arguments> : <errno associated message>

我的观点是,我希望有一个“类似恐怖”的痕迹:

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

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

<Message with arguments>
<errno associated message>

它可以正常工作,但错误相关的消息是在\ n \ n字符后发送的(我认为因为缓冲了stderr) 所以我获得了:

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

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

nodes[i]

但是这个解决方案也失败了,因为没有插入错误的意思,甚至没有写出行结尾。

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

1 个答案:

答案 0 :(得分:0)

感谢你的建议我成功地做了我想做的事。

根据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);

再次感谢;)