我目前正在尝试为作为守护进程运行的程序定义日志宏。
因为它是一个守护进程,我将 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/