我有一些代码使用sd_journal_send()来记录系统日志。是否有任何方法可以将消息打印到stdout或stderr。当我运行代码用于测试目的时,我想避免它写入系统日志。
答案 0 :(得分:0)
使用动态链接器技巧伪造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]
...