有啥方法可以将 sd_journal_send 重定向到 stdout 或 stderr?
Posted
技术标签:
【中文标题】有啥方法可以将 sd_journal_send 重定向到 stdout 或 stderr?【英文标题】:Any way to redirect sd_journal_send to stdout or stderr?有什么方法可以将 sd_journal_send 重定向到 stdout 或 stderr? 【发布时间】:2017-08-10 15:29:03 【问题描述】:我有一些代码使用 sd_journal_send() 记录到系统日志。有什么方法可以将消息打印到标准输出或标准错误。当我出于测试目的运行代码时,我想避免它写入系统日志。
【问题讨论】:
【参考方案1】:使用动态链接器技巧伪造sd_journal_sendv
:
#include <sys/uio.h>
#include <unistd.h>
#define __USE_GNU
int sd_journal_sendv(const struct iovec *iov, int n)
/* send values seperated by newline */
while (n-- > 0)
writev(1, iov+n, 1);//
write(1,"\n", 1);
编译:
gcc -shared -fPIC fake_journal.c -o fake_journal.so -ldl
使用这个示例程序:
#include <systemd/sd-journal.h>
#include <unistd.h>
int main(int argc, char *argv[])
sd_journal_send("MESSAGE=Hello World, this is PID %lu!", (unsigned long) getpid(),
"PRIORITY=%i", LOG_INFO,
NULL);
结果如下:
LD_PRELOAD=$PWD/fake_journal.so ./test
PRIORITY=6
MESSAGE=Hello World, this is PID 18772!
CODE_FUNC=main
CODE_LINE=8
CODE_FILE=test.c
您可以使用LD_DEBUG 环境变量调试动态链接器:
LD_DEBUG=all LD_PRELOAD=$PWD/fake_journal.so ./test
...
24082: symbol=sd_journal_sendv; lookup in file=./test [0]
24082: symbol=sd_journal_sendv; lookup in file=/tmp/fake_journal.so [0]
24082: binding file /usr/lib/libsystemd.so.0 [0] to /tmp/fake_journal.so [0]: normal symbol `sd_journal_sendv' [LIBSYSTEMD_209]
...
【讨论】:
你能完成这项工作吗?对我来说,它仍然调用真正的 sd_journal_sendv。解析符号时,动态链接器会返回(到预加载的库)来查找符号吗?也就是在执行sd_journal_send的时候需要找到sd_journal_sendv,不就是找同一个(systemd)库吗? 是的,它对我有用。我添加了有关使用LD_DEBUG
变量调试动态绑定的信息。
是的,所以看起来如果我直接从 main 调用 sd_journal_sendv,它将使用我的预加载版本,但调用 sd_journal_send 使用标准版本的 sd_journal_sendv。是否有可能在编译我正在使用的 systemd 库时,编译器在 sd_journal_send 内内联了对 sd_journal_sendv 的调用?
无论如何,我都可以使用预加载技巧来提供 sd_journal_send 的虚拟实现...以上是关于有啥方法可以将 sd_journal_send 重定向到 stdout 或 stderr?的主要内容,如果未能解决你的问题,请参考以下文章
response.getOutputStream();是否在servlet里面就不可以请求转发或者重定向,有啥解决方法
.htaccess 重定向对 Google bot 有啥影响?