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

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

我目前正在尝试将 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

可执行foo文件会自动将所有 HTTP 请求记录到 stdout - 这已经过充分测试。但是,当我使用 查看日志时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...

有人能解释一下为什么它没有记录所有 stdout 输出吗?我简单查看了一下先前这个问题,但这没有帮助——然而它暗示了类似“...可能不适用于不使用的系统满的systemd”——Ubuntu 15.04 会出现这种情况吗?提前谢谢您,任何帮助都将不胜感激!

答案1

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

可以使用以下方法在应用程序内部更改缓冲设置缓冲区图书馆电话。

但也可以用标准缓冲区启动时命令:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(适用于行缓冲情况)

答案2

默认开启Ubuntu 15.04systemd日志只是易失性的,/run/systemd/journal每次重启后都会保留并丢失。要使用执着的 systemd日志,您需要创建/var/log/journal目录(并重新启动 systemd-journald.service)。

因此,stdout输出可能只是重定向到syslog,而不是保留在systemd日记。为此,您可能需要使用执着的 systemd日志如上所述。

您检查/var/log/syslog过您的foo日志吗?

相关内容