【发布时间】:2017-08-10 15:29:03
【问题描述】:
我有一些代码使用 sd_journal_send() 记录到系统日志。有什么方法可以将消息打印到标准输出或标准错误。当我出于测试目的运行代码时,我想避免它写入系统日志。
【问题讨论】:
我有一些代码使用 sd_journal_send() 记录到系统日志。有什么方法可以将消息打印到标准输出或标准错误。当我出于测试目的运行代码时,我想避免它写入系统日志。
【问题讨论】:
使用动态链接器技巧伪造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]
...
【讨论】:
LD_DEBUG 变量调试动态绑定的信息。