Linux C |我们如何将 printf 重定向到 syslog?

Linux C |我们如何将 printf 重定向到 syslog?

到目前为止,我们一直在使用 printf,输出将发送到 stdio。现在我们想将其从 stdio 中删除并放入 syslog 中。

我有一个很大的代码库,因此替换所有 printf 并不是一个好方法。

有些想法是使用 freopen() 或 dup()/dup2() 但我对这些并不完全放心。

有人知道我们如何存档吗?

答案1

一种方法可能是将stdout1 更改为管道,logger该管道将完成格式化日志消息并将其发送到系统日志的繁重工作:

char cmd[64];
sprintf(cmd, "logger -t your-program -p daemon.info --id=%d", getpid());
stdout = popen(cmd, "w");
setlinebuf(stdout);

(错误处理留作练习)

或者根本不修改您的程序,而是将其运行为:

sh -c 'echo "$$"; exec stdbuf -oL your-program' |
  (
    IFS= read -r pid &&
      exec logger -p daemon.info -t your-program --id="$pid"
  )

your-program请注意,在这种情况下,所有 by及其子项的输出都会被重定向到logger,包括未通过 stdio API 完成的情况(例如使用 direct write(1, data, length),并且假设 fd 1 没有被重定向到其他内容)。

-oLsetlinebuf(stdout)尝试通过将该代码注入可执行文件来实现与上述相同的效果。如果您编程(或它调用的任何其他程序也会受到影响)否则调用setvbuf()或不是动态链接,或者是 setuid/setgid...


¹ stdioFILE*对象,而不是实际的 stdout / fd 1 ,因此,如果您的程序在子进程中执行其他命令,它们不会受到影响。

相关内容