我正在运行带有 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 以不同的方式运行(即:基于大小),则必须采取其他措施。