有什么方法可以将sd_journal_send重定向到stdout或stderr?

时间:2017-08-10 15:29:04

标签: logging systemd syslog

我有一些代码使用sd_journal_send()来记录系统日志。是否有任何方法可以将消息打印到stdout或stderr。当我运行代码用于测试目的时,我想避免它写入系统日志。

1 个答案:

答案 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]
...