将 systemd 服务日志重定向到文件

roy*_*roy 31 linux ubuntu

我试图在 Ubuntu 16.04 上运行水槽作为 systemd 服务并在 /etc/systemd/system/flume-ng.service

[Unit]
Description=Apache Flume

[Service]
ExecStart=/usr/bin/nohup /opt/flume/current/bin/flume-ng agent -c /etc/flume-ng/conf -f /etc/flume-ng/conf/flume.conf --name a1 &
ExecStop=/opt/flume/current/bin/flume-ng agent stop

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

我尝试添加以下几行

StandardOutput=/var/log/flume-ng/log1.log
StandardError=/var/log/flume-ng/log2.log   
Run Code Online (Sandbox Code Playgroud)

这对我不起作用。我没有跑systemctl daemon-reloadsystemctl restart flume-ng

有谁知道这是如何工作的?

Pio*_*icz 41

重定向

以下仅适用于 systemd v236 及更新版本:

StandardOutput=file:/var/log/flume-ng/log1.log
StandardError=file:/var/log/flume-ng/log2.log
Run Code Online (Sandbox Code Playgroud)

如此处所述

如果 systemd 早于 v236,您可以使用:

ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >/var/log/flume-ng/log1.log 2>/var/log/flume-ng/log2.log'
Run Code Online (Sandbox Code Playgroud)

请注意,这样每次服务重新启动时,整个日志文件内容都将被覆盖。

附加

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

# Works only in systemd v240 and newer!
StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log
Run Code Online (Sandbox Code Playgroud)

如果 systemd 早于 v240,您可以使用:

ExecStart=/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:写入文件仅在 `systemd` 版本 236 中添加。 (4认同)
  • `file:` 选项第一次创建一个新文件,然后在随后重新启动应用程序时失败,我尝试了 `append:`,但它根本不起作用 (4认同)

Jde*_*eBP 27

ExecStart=/usr/bin/nohup …

这是错误的。去掉它。此服务未在交互式登录会话中运行。首先没有控制终端或会话领导者向它发送挂断信号。

ExecStart=… &

这是错误的。去掉它。这不是 shell 脚本。 &没有类似 shell 的特殊含义,无论如何都是启动服务的错误方式。

StandardOutput=/var/log/flume-ng/log1.log
StandardError=/var/log/flume-ng/log2.log

这些都是错误的。不要使用这些。systemd已经将服务进程的标准输出和错误发送到其日志,服务单元中没有任何此类设置。你可以查看它

journalctl -e -u flume-ng.service

  • 如果我想将日志发送到不同的文件怎么办 - 是否可能?如果可能,这样做的**正确**方法是什么? (60认同)
  • 这是如何被选为正确答案的?问题是我们如何将服务特定日志重定向到用户想要的文件。不是如何尾随它。 (6认同)

小智 13

要在不覆盖的情况下记录到文件(需要 system.d 版本 240+):

StandardOutput=append:/var/log/flume-ng/log1.log
StandardError=append:/var/log/flume-ng/log2.log
Run Code Online (Sandbox Code Playgroud)

或者

StandardOutput=append:/var/log/flume-ng/log.log
StandardError=inherit
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这对我不起作用。该服务仍然启动,但日志文件中没有任何内容,如果删除,则不会重新创建。Ununtu 18.04,system.d 237 (7认同)
  • @SystemicPlural你是对的。这只在 system.d 240 中添加了针对此问题的 PullRequest:https://github.com/systemd/systemd/issues/10875 (2认同)

kub*_*rik 7

我希望这可以帮助别人。对于乌南图

[Unit]
Description=name-service
After=syslog.target
After=mysql.service
Requires=mysql.service
[Service]
Type=idle
PIDFile=/path_to_PID/****.pid
WorkingDirectory=/path_to_directory
User=root
Group=root
ExecStart=****.py
Restart=always
TimeoutStartSec=1min
RestartSec=1min
KillMode=process
StandardOutput=append:/path_to_log/service.log
StandardError=append:/path_to_log/service_error.log
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

对于 CENTOS

[Unit]
Description=name-service
After=syslog.target
After=mysql.service
Requires=mysql.service
[Service]
Type=idle
PIDFile=/path_to_PID/****.pid
WorkingDirectory=/path_to_directory
User=root
Group=root
ExecStart=****.py  >>/path_to_log/log.log
Restart=always
TimeoutStartSec=1min
RestartSec=1min
KillMode=process
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

“之后”和“需要”是必要的。注意“用户”和“组”

另一种选择:在执行的脚本中添加日志记录。

  • 对不起。我写错了。“我希望有人能提供帮助”->“我希望这对某人有帮助。” (2认同)