【问题标题】:Is it possible to send the message produced by perror() to /var/log/syslog?是否可以将 perror() 生成的消息发送到 /var/log/syslog?
【发布时间】:2016-03-16 19:36:36
【问题描述】:

我正在使用 perror() 打印错误消息,例如:

pid = fork();
if (pid < 0) {
    perror("couldn't fork");
    exit(EXIT_FAILURE);
}

是否可以使用errno/perror() 设施,但将生成的消息定向到系统日志(/var/log/syslog)?

我在可以在守护程序和非守护程序模式下运行的程序的上下文中提出这个问题。在守护进程模式下,perror() 消息不会出现在系统日志中。

【问题讨论】:

  • 在代码中尽早检查当前模式。然后编写一个以字符串为参数的小函数,并根据程序前面设置的当前模式调用 perror() 或调用 syslog()

标签: c error-handling daemon syslog errno


【解决方案1】:

使用strerror 根据错误代码获取错误消息,而不打印它。然后像任何其他日志消息一样将其传递给syslog

syslog(LOG_ERR, "Couldn't fork: %s", strerror(errno));

【讨论】:

    【解决方案2】:

    最简单的方法是在调用程序时重定向 stderr(可能还有 stdout)。例如:./myprog 2&gt;&amp;1 | logger

    【讨论】:

    • 谢谢,但我想以正确的方式做到这一点,即使用特定于守护进程(fork 等)和 syslog() 的代码。
    • 使用重定向,例如在 shell 脚本或 cron 条目中,IS 在绝大多数情况下都是“正确的方式”。如果您想以编程方式记录,请参阅“man syslog”。如果要重定向(stderr,文件 #2),请使用 dup2:stackoverflow.com/questions/14543443/…。如果您希望错误文本独立于调用 perror(),那么 man strerror.
    • 我正在使用syslog()。我想做的是将syslog()errno/perror() 结合起来。
    • 那么听起来 strerror() 可能是你的人:)
    【解决方案3】:

    假设您具有写入 syslog 的正确权限,我不明白为什么您不能将输出通过管道传输到该文件。您还可以使用 fprintf 和 stderr 将错误结果输出到您创建的文件中。

    【讨论】:

    • 要求是我想使用errnoperror() 功能。当系统调用失败并且perror() 打印相关的错误消息时,errno 被设置为适当的错误号。
    • 除非他以 root 身份运行,否则他将无权直接写入 syslog。一切都应该通过syslog()函数发送。
    猜你喜欢
    • 2016-01-12
    • 2019-10-14
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多