我正在尝试为作为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]
但是这个解决方案也失败了,因为没有插入错误的意思,甚至没有写出行结尾。
有人知道如何在不使用函数的情况下实现它吗?
答案 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);
再次感谢;)