在发送到远程收集器之前,在rsyslog v7中重写设施/严重性

我有一台带有本地rsyslogd的机器“A”,另一台远程收集器机器“B”正在使用自己的syslog守护进程和日志处理引擎进行侦听。 这一切都很好…除了在A上有一个进程logginglocal0.notice,这是B的引擎无法处理的东西。

我想要做的是在将事件发送到B之前将local0.notice重写为local5.info。不幸的是,我不能更改B,也无法更改login过程的方式A.我也不能升级A从v7.6到v8(似乎有一些非常有用的function,如mmexternal,这可能有所帮助)rsyslogd。

我想我一定是错过了一些明显的东西,我不能成为第一个需要这种function的人。 基本上,它归结为寻找某种方式通过rsyslog两次之间的filter:一旦进程logging,通过filter更改prio,然后再转发它。

我试过了:

  • configurationrsyslog将local0.noticelogging到一个文件中,然后用一个imfile指令读取该文件,并为其设置新的fac / sev,然后是一个if语句,查找标签并调用omfwd操作。 我想也许我可以说服rsyslog写在正确的prio文件,然后rsyslog回来,自然而然地拿起它。 可悲的是,没有骰子。
  • 加载一个调用logging器的omprog模块-p local5.info如果syslogfacility-text =='local0',那么在那里停止处理…然后让另一个configuration元素检查syslogfacility-text =='local5',如果是的话调用一个omfwd行动。 奇怪的是,这个工程,但不压缩原来的消息,现在我只是得到两套日志被转发到B,一个local0和一个local5。

那里有解决scheme吗?

这比解决scheme更具破坏性,但是我找不到任何“干净”的方式来解决您的问题:

local0.notice消息的UDP数据包有效载荷将始终以<133>值(根据rfc3164为16 * 8 + 5)开始,而local5.info映射到<174>(21 * 8 + 6)。

您可以在A上使用nfqueue + scapy在发送数据包的同时重写所有<133>到<174>的事件,而B将接收和logginglocal5.info消息而不是local0.notice。

所有其他系统日志UDP数据包将不受影响并正常logging。

简单的例子: https : //byt3bl33d3r.github.io/using-nfqueue-with-python-the-right-way.html

RFC: https : //www.ietf.org/rfc/rfc3164.txt

表格PRI值的脚本: http : //www.digitalprognosis.com/opensource/scripts/syslog-priorities.py

在与syslog-ng合作之后,我相信你可以做你正在寻找的东西,用它作为主机A上的主系统日志守护进程,并把你的操纵信息转发到“主机B”。 但是,因为需要重写“硬编码”消息标志,所以需要禁用syslog-ng自己的字段parsing,以便可以将正则expression式应用于原始syslog(协议)消息。

你会发现Syslog-NG有一个非常强大的消息处理方法,一般来说,通过阅读https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide -admin / HTML /章节-操纵-messages.html

读完之后,您将会看到,很遗憾,您可能需要禁用Syslog-NG自己的系统日志消息parsing,并通过在syslog-ng.conf中设置以下选项来处理原始数据:

flags(no-parse) 

这可能会导致问题。 例如,您将不再将多行系统日志消息视为“单个消息”,因为syslog-ng需要parsing消息以了解它是单个消息。

参考: https : //en.wikipedia.org/wiki/Syslog-ng