有啥方法可以将 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里面就不可以请求转发或者重定向,有啥解决方法

有啥方法可以更改 DM 名称?不和谐 js 12

.htaccess 重定向对 Google bot 有啥影响?

行人重识别在深度上有啥问题可以提

将 NSFetchRequest 重用于 Core Data 的多个不同提取有啥不好的吗?

有啥方法可以在不使用自适应付款的情况下为第三方处理付款?