![如何获取由 EL7 上的 systemd 控制的服务的标准输出/错误,并将其发送到 /var/log/messages 之外的其他位置?](https://linux22.com/image/78122/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E7%94%B1%20EL7%20%E4%B8%8A%E7%9A%84%20systemd%20%E6%8E%A7%E5%88%B6%E7%9A%84%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%A0%87%E5%87%86%E8%BE%93%E5%87%BA%2F%E9%94%99%E8%AF%AF%EF%BC%8C%E5%B9%B6%E5%B0%86%E5%85%B6%E5%8F%91%E9%80%81%E5%88%B0%20%2Fvar%2Flog%2Fmessages%20%E4%B9%8B%E5%A4%96%E7%9A%84%E5%85%B6%E4%BB%96%E4%BD%8D%E7%BD%AE%EF%BC%9F.png)
我的用例是 Fabrice A. Marie 的使用 systemd 记录重复项文章(由 Kibin Labs 发布)归入“丑陋”类别,其简短建议添加到整个 ELK 堆栈(它说这是“唯一的手段”),因为“丑陋”对于我的需求来说有点过分了。
Fabrice A. Marie 的分类是,“好的”应用程序可以重定向到标准输出,/dev/null
而不会导致信息丢失,只向标准错误写入很少的内容,因此/var/log/messages
(通过 systemd 日志),并通过 per- 发送大量日志。应用程序日志记录机制(不受 systemd 或 rsyslog 管理)到私有应用程序维护的日志文件。如果有的话,这就是撤销我想要的东西,而不是按照我的标准“好”。
我有几个应用程序(其中一个是为了举例而选择的,是 phantomjs 后端预渲染,但这只是一我的用例)在 systemd 下作为服务启动。 我的应用程序将其日志发送到标准输出和标准错误(这是正常的默认行为console.log()
在 Node.js 中)。它似乎错误的为了使这些有资格成为“好”,他们应该被重写以进行自己的私有日志记录,而不是使用 systemd (就像现在一样)。无论如何,我无法自己重新编码这些应用程序。
根据 Fabrice A. Marie 的说法以及我读过的其他内容,我似乎可以明确选择将所有标准输出/标准错误信息发送到 或/dev/null
发送到/var/log/messages
.没有快乐中位数吗?我是否可以不设置 systemd (以及其他任何东西),以便将我的应用程序日志写入标准输出/错误,由 systemd 以正常方式处理,中间没有整个 ELK 堆栈,但最终还是会出现这样的情况?在另一个地方而不是/var/log/messages
?
我正在运行 CentOS 7 和 RHEL 7,我的示例服务的服务单元当前是这样的:
[Unit]
Description=prerender
After=network.target
[Service]
ExecStart=/usr/local/bin/node /var/www/prerender/node/server.js
Restart=always
User=prerender
Group=adm
Environment=PATH=/usr/bin:/usr/local/bin PORT=8900
WorkingDirectory=/var/www/prerender/node
[Install]
WantedBy=multi-user.target
答案1
这篇文章看起来简直是无稽之谈,将 systemd 恶意接管日志功能造成的问题归咎于其他软件。它甚至提到了解决方案(syslog),但只是作为建议大规模过度杀伤的一种手段,例如logstash
.
您不需要使用 Logstash 来在单个主机上记录少量守护进程。
来自文章:
默认情况下,当它执行此操作时,标准输出将重定向到日志。默认情况下,日志依次发送到 syslog,在 RedHat 7 兼容发行版上,该日志最终将位于 /var/log/messages 中。
然后,它完全忽略了明显且合理的配置选项rsyslogd
,并暗示如果您想做日志无法做的事情,则logstash
和是唯一的选项。elasticsearch
现代系统日志守护进程,例如rsyslog
和 ,syslog-ng
可以配置为按各种标准过滤系统日志消息,包括守护进程名称和正则表达式模式匹配。默认值可能是/var/log/messages
,但是更改默认值非常容易。
因此,您需要一些rsyslog
规则来过滤来自服务的系统日志消息。
无论 systemd 拥护者如何看待日志记录,他们都喜欢假装这journald
是必要的,因为在此之前的日志记录是原始且不灵活的,他们正在解决一个以前没有人考虑过的问题,更不用说多次解决了。
另外,顺便说一句,程序进行日志记录的正确方法既不是 stdout 也不是 stderr,而是使用大多数语言中可用的 syslog 函数。