如何在运行 systemd 服务时创建 syslog 拥有的故障日志文件?

如何在运行 systemd 服务时创建 syslog 拥有的故障日志文件?

我在 ubuntu 16.04 上以服务形式运行 Go 二进制文件,但无法创建 syslog 拥有的日志文件。我为 myapp.service 创建了一个服务,如下所示:

[Unit]
Description=myapp

[Service]
Type=simple
Restart=always
RestartSec=30
WorkingDirectory= /home/go/src/myapp
ExecStart=/home/go/src/myapp/myapp  

# myapp.log owned by syslog
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/log/myapp
ExecStartPre=/bin/chown syslog:adm /var/log/myapp
ExecStartPre=/bin/chmod 755 /var/log/myapp
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp                           

[Install]
WantedBy=multi-user.target

现在它只是在 /var/log/myapp 内创建一个文件夹。但没有在 myapp 文件夹中创建任何 myapp.log 文件。我可以使用命令 :: 检查这些日志

sudo journalctl -f -u myapp

它将显示终端内的所有日志。我有以下问题::

  1. 我如何创建一个日志文件来保存所有日志(在 /var/log/myapp/myapp.log 内)。
  2. 我还想对日志进行分类,比如我只想保留失败日志,那么在创建日志文件后,如何在 myapp.log 中写入失败日志。目前它在终端内显示所有日志(成功和失败)。
  3. 我在端口 8080 上访问 golang api,但每次检查端口时它似乎都不忙。我不明白为什么当我将其作为服务运行时端口 8080 不忙。虽然它在两种情况下都会做出响应,但在停止服务后,如果在前台运行应用程序,它会显示端口 8080 忙。这有什么原因吗?

答案1

如果您使用 rsyslog 来管理系统日志,请在 /etc/rsyslog.d/myapp.conf 中创建一个文件,其中包含以下内容:

if $programname == 'myapp' then /var/log/myapp/myapp.log
& stop

现在重新启动 rsyslog 服务,您应该看到端口 514 上的 syslog 监听器,重新启动 myapp,现在您应该看到日志事件被发送到日志文件。

sudo systemctl restart rsyslog
sudo systemctl restart myapp

但是它将创建一个包含成功失败日志的日志文件。

相关内容