将一些系统日志消息路由到另一台服务器(通过 UDP)

route some syslog messages to another server (via UDP)

更新:我用词太多,不清楚我真正想要达到的目标。我现在编辑文本以使我的意图更清楚 - 提供我自己的答案(见下文)因为我成功地为我解决了这个问题。

TL;DR:

归根结底,问题是:

我如何配置系统日志,以便一些消息被路由到另一个处理它们的服务?

字数较多的问题(如果你有时间的话;)):

我有一个集成测试场景,其中 Raspi 将编排和执行测试。 Raspi“从外部”刺激被测设备 (DUT) 并监听 DUT 的任何预期反应。因此,一个典型的集成测试场景(黑盒测试)。

+-----+   +-----+
| RPi |---| DUT |
+-----+   +-----+

要测试的功能之一是 DUT 是否会正确地向远程 rsyslog 服务器发出 syslog 消息。 所以我决定 Raspi 应该是“远程 rsyslog 服务器”(a.k.a。syslog 接收器),因此可以测试 DUT 是否会发送它预期的所有 syslog 消息。 现在如何在 Raspi 上断言接收到的系统日志消息?我可以简单地浏览 Raspi 上的系统日志消息,并期望找到来自 DUT 的消息——以及来自 Raspi 本身的许多其他“标准”系统日志消息。

这样测试 运行ner 就不必解析由“普通”rsyslog 服务器写入的日志文件。

测试后运行,我希望“其他东西”停止监听,“正常”rsyslog 配置恢复正常。

大致思路是这样的。您认为这是可行的(而且不太复杂)的方法吗?

“另一件事”将是一个 Python 脚本,因为整个测试编排都是用 Python 编写的。因此,也许 Python rsyslog 服务器侦听特殊端口,并另外配置“正常”服务器 rsyslog,以便消息也转发给此 Python 消费者。

如果可以将“普通”rsyslog 服务器配置为将这些消息中继到满足特定条件的“其他东西”,那就更好了。

你认为我应该坚持解析日志文件还是这看起来是个好主意?

使用系统日志,您可以使用带有 @ 符号和 IP 地址的目标 - 然后这些消息将通过 UDP 转发。所以你所要做的就是决定系统日志设施、优先级和其他标准(例如源 IP)并添加你的 rsyslog.conf 例如:

local7.info  @127.0.0.1:10514

因此,所有匹配的系统日志消息都将通过 UDP 发送。如果没有进程在该端口上侦听,则不会发生任何事情,因此 rsyslog 系统没有问题。

就是这样,我写的所有其他东西都试图描述这个的用例。基本上,我永久地配置了这个 rsyslog 设置(因为当没有 UDP 服务器使用消息时它没有害处)。当集成测试启动时,UDP 服务器启动并在测试期间收集所有系统日志消息 – 仅那些感兴趣的(这是系统日志规则必须确保的 - 在上面例如一个简单的 local7.info,但它可能更复杂)。这就是我努力实现的目标,也是我做到的。