配置 syslog-ng 服务器以截断中继到多个目的地中的仅 1 个目的地的消息

Configure syslog-ng server to truncate messages relayed to only 1 destination out of multiple destinations

我现有的 syslog-ng PE 5(是的,旧的)服务器使用多个日志语句在本地写入所有日志,并将一些消息中继到我们企业中的外部日志扫描服务。

这些外部中继目的地之一的操作员要求我们将中继给他们的每条日志消息截断到特定的最大长度。

我不想减少消息长度的全局值。我只想限制发送到这个目的地的大小。

我假设这将是日志语句中的开关或标志。我查看了有关重写规则的文档,但没有看到任何明显的内容。

你是怎么解决这个问题的?

虽然不像设置标志那么简单,但我可以想到 3-4 种可能的解决方案。不过,并非所有这些都适用于 PE 5。

如果您愿意升级:

  1. 较新的 syslog-ng 版本 (PE 7 / OSE 3.1x) 具有完全满足您需要的 substr() template function,因此您可以在将日志发送到的目标模板中使用它扫描仪。
  2. 如果你安装的是最近的syslog-ng版本(PE 7.12+ / OSE 3.15+),你需要更精细的处理,你可以在Python中编写一个自定义模板函数来切片和切块消息。

如果你想坚持使用旧版本:

  1. 由于您已经将日志消息写入文件,您可以在 syslog-ng 中创建一个新的文件源,从文件中读回消息,并设置 log-msg-size() 选项该源的限制到您想要截断消息的限制(IIRC,syslog-ng 将截断消息并丢弃多余的部分,但您必须测试它不会从截断的部分创建第二条消息)。这个解决方案的问题是 PE 5 中的文件源不能跟在多个文件之后的 IIRC,因此如果您在 file/directory 名称中使用日期宏或类似内容,那将是一个问题。 PE 6+ 和更新的 OSE 版本可以在文件源中使用通配符。
  2. 如果一切都失败了,您可以尝试使用程序目标编写一个脚本来以某种方式处理消息。

就我个人而言,我建议进行某种升级(PE 5 很古老并且已停产)。如果您无法升级到最新的 PE 版本,最简单的解决方案可能是安装 OSE 中继,这样您的 PE 5 服务器将日志发送到 OSE,OSE 可以使用 substr() 模板函数截断消息并将它们发送到你的日志扫描器。

HTH, 罗伯特