15.04 上的 systemd 不会记录单元的标准输出

Ath*_*ark 16 logging log stdout systemd 15.04

我目前正在尝试将 systemd 单元制作为 Web 服务器。目前,我的foo.service文件如下所示:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

foo可执行文件自动记录所有的HTTP请求到标准输出-这是很好的测试。但是,当我查看日志时journalctl -u foo,我只能得到这样的输出:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么不记录所有标准输出吗?我简要地查看了上一个问题,但它没有帮助 - 但是它暗示了“......可能不适用于不使用完整systemd 的系统”的内容 - 这是否适用于 Ubuntu 15.04 ? 在此先感谢您,任何有关此问题的帮助将不胜感激!

Vel*_*kan 9

事实上,UNIX 中的缓冲取决于上下文:当 stdout 被重定向到像控制台这样的交互式东西时 - 它通常是行缓冲的,否则它是完全缓冲的。

可以使用setvbuf库调用在应用程序内部更改缓冲。

但也可以在启动时使用stdbuf命令来完成:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo
Run Code Online (Sandbox Code Playgroud)

(对于行缓冲的情况)