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

Sti*_*ley 6 centos systemd

我的用例是 Fabrice A. Marie 的Logs 与 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
Run Code Online (Sandbox Code Playgroud)

cas*_*cas 2

这篇文章看起来简直是无稽之谈,将 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 函数。