我有一个 C/C++ 程序,它作为 systemd 服务运行,使用 stdout 和 stderr 的默认配置,又名journald(
journalct -u SERVICE
)。我想用journald查看我的printf调用,这是我以合理的方式查看它们的唯一方法时间范围是如果我使用 setvbuff(stdout, nullptr, 0, _IOLBF)
合理的意思是我没有看到任何没有行缓冲或没有缓冲的输出(_IOLBF
/ _IONBF
)
我的问题实际上是想了解使用 setvbuff 修改缓冲是否是合理的事情。我发现行缓冲比完全缓冲慢,如此处所示stackOverflow post,但如果没有行缓冲或没有缓冲,我不会从日志中的程序中获得任何输出。 Printf 在运行二进制文件以及设置
StandardOutput=tty
时工作正常。
节目简介: 这是一个相当大的嵌入式linux程序,作为前端。还有其他三个服务本质上是具有相同问题的后端。 我想 100% 确定这是一件安全的事情,因为这个嵌入式程序将在高度监管的领域中使用,并且不能承受内存泄漏/其他内存问题,并且这些 printfs 用作调试日志。
服务配置文件:
[Unit]
Description="UI service"
[Service]
ExecStart=/home/root/startBinary
Restart=always
[Install]
WantedBy=multi-user.target
相关的system.conf行(默认情况下未编辑):
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
未修改缓冲的
journalctl -u SERVICE
输出示例:
Aug 09 08:29:54 computername systemd[1]: Starting SERVICE...
示例
journalctl -u SERVICE
带行缓冲/无缓冲:
Aug 09 08:32:20 computername systemd[1]: Starting SERVICE...
Aug 09 08:32:21 computername systemd[1]: Hello world from SERVICE printf
在不修改 buffer 方法的情况下,我还没有看到我的 printf 到达journald。
我尝试使用
setvbuff(stdio, nullptr, 0, _IOLBF)
并得到了我想要的结果。
从技术上讲,这取决于你的 libc 实现它的程度(因为 I/O 缓冲是由 libc 提供的),但通常是安全的,因为对于某些输出来说,默认情况下已经发生了这种情况(当 stdout 是一个时,行缓冲是默认的) tty,如果我没记错的话,它是 stderr 的默认值),并且无论如何你仍然使用相同的底层机制 - 它仅在输出被刷新时改变,而不是操作中的基本内容。 [这不应被视为提供 100% 的保证。]