如何让 systemd 单元将日志重定向或复制到 syslog?

如何让 systemd 单元将日志重定向或复制到 syslog?

我正在运行带有 node.js 服务的 Ubuntu 16.04 Server,我需要将日志写入文件,就像旧的 syslog 一样:)

我已经在谷歌上搜索了半个晚上,但什么也没找到。

这个奇怪需求背后的原因是我们正在通过 filebeat 收集日志并将其发送到 ElasticSearch 集群。

答案1

找到了一种解决方法,使用 systemd 在启动我需要获取日志的服务后立即运行 journalctl。

添加 systemd 服务脚本来为“MyService”创建日志文件 /etc/systemd/system/multi-user.target.wants/MyService-journalctl-to-log.service

[Unit]
Description=MyService journalctl parser to filebeat
#I needed to get a log file for filebeat to read
#Wants=filebeat.service
#After=filebeat.service

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sh -c '/bin/journalctl --no-tail -f -u MyService.service  > /var/log/MyService.log 2>&1'
ExecStartPre=/bin/journalctl --vacuum-size=10M

[Install]
WantedBy=multi-user.target

启用并启动新的 systemd 服务

systemctl enable MyService-journalctl-to-log.service
systemctl start MyService-journalctl-to-log.service

答案2

免责声明:如果任何目录有误,请告知我或自行编辑(如果可以)。这是我凭直觉写的。

我知道这已经过时了,但如果您的 SystemD 版本足够新,您可以充分利用它。您可以让现有的操作系​​统服务和计划发挥它们的优势。您的单元文件可以告诉守护进程,输出必须发送到 syslog ( man systemd.exec)

[Unit]
Description=...

[Service]
WorkingDirectory=...
User=...
Group=...

StandardOutput=syslog
StandardError=inherit

SyslogIdentifier=<program-name>
SyslogFacility=local4 # just because... choose your own

ExecStart=... your command

[Install]
WantedBy=multi-user.target

放入文件,/usr/local/lib/systemd/system/这样你就不会把你的单元文件与其他包维护者的文件混淆了(man systemd.unit我认为)

不要忘记让 SystemD 知道此单元可用(或已修改):

sudo systemctl daemon-reload

这会将您的单元文件添加到multi-user.target目录中。

现在,您的输出已运行到 rsyslog,是时候告诉 rsyslogd 如何处理它了。填写/etc/rsyslog.conf.d/10-<your-program-name>.conf以下指令

if ($programname == "<your-programname>") then {
        action(
                type="omfile"
                FileOwner="syslog"
                FileGroup="adm"
                File="/var/log/<programname>/<programname>.log"
                FileCreateMode="0644"
        )
        stop
}

如果缺少任何目录,请创建它们。请记住输入正确的所有权和权限。可以为设置日志目录syslog:adm

重新启动 rsyslogd 以便它获取配置。

但我们还没有完成。文件会不停地增长。配置logrotate以便您可以让日志轮换。将以下配置放入/etc/logrotate.conf.d/<programname>

/var/log/<programname>
{
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
}

这只是基本设置。请自行进行个人调整(有很多手册页需要阅读)。没有 logrotate 服务,它只是一个通常每天运行的计划任务(我不记得是 cron 还是 anacron)。

如果您的日志在一天内增长过快,请小心。如果您希望 logrotate 以不同的方式运行(即:基于大小),则必须采取其他措施。

相关内容