【问题标题】:Log macro with formatted perror trace带有格式化 perror 跟踪的日志宏
【发布时间】:2017-12-14 11:41:04
【问题描述】:

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

因为它是一个守护进程,所以我将 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 表示,甚至没有写入行尾字符。

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

【问题讨论】:

  • 只是一个评论:一般来说,守护进程不应该使用stdout和stderr。也许 syslog() 或 vsyslog() 是更好的选择?
  • 为什么功能不对?无论如何,您都调用 printf 。使函数内联,您将获得相同的性能。
  • fmt 参数是否总是字符串文字?然后,您可以将字符串连接与# 或仅与空格一起使用。例如。 fmt ": %s\n"
  • 您可以使用strerror(),但要遵守通常的注意事项(主要是确保在errno 更改之前捕获正确的值)。另请参阅C #define macro for debug printing

标签: c linux error-handling macros


【解决方案1】:

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

按照 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);

再次感谢 ;)

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2022-08-17
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多