如何获取由 EL7 上的 systemd 控制的服务的标准输出/错误,并将其发送到 /var/log/messages 之外的其他位置?

如何获取由 EL7 上的 systemd 控制的服务的标准输出/错误,并将其发送到 /var/log/messages 之外的其他位置?

我的用例是 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 函数。

相关内容