我想用来syslog(3)
将应用程序日志写入中央记录器。该应用程序在同一子网上的一组计算机上运行。
(目前)对将系统(非应用程序)日志捕获到中央服务器不感兴趣。对将应用程序日志捕获到每个本地系统的 systemd 日志中不感兴趣。
目的是使用syslog(3)
“local0”-“local7”跳过 systemd 日志,而是通过 UDP(可能是端口 514)写入记录器。
这似乎与通常的问题(如何将应用程序日志重定向到系统日志)相反。
目前正在思考 Centos systemd/rsyslog lashup 的意义何在。需要明确的是,我希望在接下来的几天内解决这个问题。
向下一个人提出问题,他和我一样正在寻找答案,但没有立即运气。 :)
答案1
目的是使用
syslog()
“local0”-“local7”跳过 systemd 日志
你不会实现它。库syslog()
函数记录到 systemd 日志中。侦听与库通信的众所周知的/dev/log
套接字的服务器不是rsyslogd
。这是systemd-journald
。 rsyslogd
是附着在另一侧的systemd-journald
,并且库函数不与它对话。无论对配置进行多少修改rsyslog
都不会改变这一点。
不通过发送东西的唯一方法systemd-journald
是使用一些其他到达目的地的路线,不是syslog()
与众所周知的套接字通信的库 函数
讽刺的是,这可能是应用程序日志的正确且更简单的位置:标准错误。将标准错误连接到与某个程序对话的管道,该程序通过网络将其传输到远程日志收集器。
我对此类内容的首选设置是在 daemontools 系列服务管理器下将应用程序作为“主要”服务运行。
- 应用程序记录到标准错误。
- 通常的 daemontools 风格的服务管理具有日志服务,其标准输入通过管道连接到应用程序的标准错误。服务管理负责在“主”服务和“日志”服务之间设置这些管道。
- 这些日志服务运行
cyclog
、multilog
、s6-log
、svlogd
或某些此类服务,并将日志转储到本地(严格限制大小、自动轮转、与应用程序隔离)日志目录中。 - 进一步的服务监视这些日志目录,并通过网络将新信息提供给运行logstash 或类似服务器的集中式日志服务器。我的
export-to-rsyslog
工具就是为此而设计的。
这样做的好处是:
- 存在本地的、可立即访问的、每个应用程序的、单独的(不与其他事物混合或被其他事物淹没)、最近的日志;
- 与日志服务器的不稳定网络连接不会对应用程序施加背压(就像在更直接的模型中一样,在该模型中应用程序标准错误通过网络进行通信,或者直接连接到立即通过网络中继的进程);
- 网络传输相对于本地日志记录来说是完全非侵入性的,可以稍后设置(当数据量增长到需要像集中式 Logstash 之类的东西时),并且可以重新配置(添加/删除发送的应用程序日志)网络)而不影响它;和
- 在极端情况下,人们甚至可以安排将最近的日志数据重播到不稳定/意外擦除的日志服务器。
进一步阅读
- https://unix.stackexchange.com/a/294206/5132
- 乔纳森·德博因·波拉德 (2015)。 ”记录”。守护进程工具家族。常见答案。
- 乔纳森·德博因·波拉德 (2019)。 ”记录”。小吃指南。软件。
- 乔纳森·德博因·波拉德 (2019)。
export-to-rsyslog
。 “命令”。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2019)。
follow-log-directories
。 “命令”。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2019)。
udp-socket-connect
。 “命令”。 小吃指南。软件。