【问题标题】: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() 记录到系统日志。有什么方法可以将消息打印到标准输出或标准错误。当我出于测试目的运行代码时,我想避免它写入系统日志。

【问题讨论】:

    标签: logging systemd syslog


    【解决方案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 的虚拟实现...
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2021-11-30
    • 2012-06-16
    • 1970-01-01
    • 2012-08-07
    • 2010-10-14
    相关资源
    最近更新 更多