systemd:如何将标准输出重定向到日志文件

exe*_*ral 12 logs systemd services stdout

我有一个 systemd 服务:

[Unit]
Description=My application

[Service]
ExecStart=/bin/java myapp.jar
Type=simple
User=photo
Run Code Online (Sandbox Code Playgroud)

有一个选项:StandardOutput=但我不明白如何使用它来写入文件。 https://www.freedesktop.org/software/systemd/man/systemd.exec.html

我希望将文件路径放在这里,但文档讨论了套接字和文件描述符。似乎它需要的配置不仅仅是那个关键字。

把文件路径放在哪里? 我找不到任何这种用途的例子

谢谢

Pio*_*icz 17

用:

[Unit]
Description=My application

[Service]
ExecStart=/usr/bin/java -jar myapp.jar
Type=simple
User=photo
StandardOutput=file:/var/log/logfile
Run Code Online (Sandbox Code Playgroud)

如此处所述:https : //www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

请注意,这种方式日志文件内容将在每次服务重新启动时被覆盖。StandardOutput/Errorsystemd 指令不支持附加到文件。

如果您想在服务重新启动之间维护文件日志,并且只是将新记录的行附加到其中,请改用:

[Unit]
Description=My application

[Service]
ExecStart=/usr/bin/sh -c 'exec /usr/bin/java -jar myapp.jar'
Type=simple
User=photo
Run Code Online (Sandbox Code Playgroud)

exec表示/bin/java在不分叉的情况下设置重定向后,shell 程序将被程序替换。所以和/bin/java直接在ExecStart=.

  • 值得一提的是 `append:` 仅在 systemd 240+ 中可用。 (9认同)
  • 用 `append:` 代替 `file:` 怎么样? (3认同)
  • 另外,“file:”仅在 236+ 中可用。您可以使用“systemctl --version”找到版本。在撰写本文时,Amazon Linux 2 附带 219... (3认同)

lak*_*tak 5

如果您的应用程序是 Python 脚本,您还需要设置

Environment=PYTHONUNBUFFERED=1
Run Code Online (Sandbox Code Playgroud)

否则,在刷新缓冲区之前,您将看不到任何日志消息。

  • 我意识到这并没有回答原来的问题,但是当有人寻找为什么我的(基于 python 的)服务不记录 stdout 时,这解决了我的问题。 (2认同)