到目前为止,我们一直在使用 printf,输出将发送到 stdio。现在我们想将其从 stdio 中删除并放入 syslog 中。
我有一个很大的代码库,因此替换所有 printf 并不是一个好方法。
有些想法是使用 freopen() 或 dup()/dup2() 但我对这些并不完全放心。
有人知道我们如何存档吗?
答案1
一种方法可能是将stdout
1 更改为管道,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 没有被重定向到其他内容)。
-oL
setlinebuf(stdout)
尝试通过将该代码注入可执行文件来实现与上述相同的效果。如果您编程(或它调用的任何其他程序也会受到影响)否则调用setvbuf()
或不是动态链接,或者是 setuid/setgid...
¹ stdioFILE*
对象,而不是实际的 stdout / fd 1 ,因此,如果您的程序在子进程中执行其他命令,它们不会受到影响。