配置rsyslog同时监听多个接口/多个规则集

https://blog.csdn.net/loveyanga/article/details/100541734

rsyslog中的多个规则集

从版本4.5.0和5.1.1开始, rsyslog支持单个配置中的多个规则集。这对于将远程消息的接收路由到一组特定规则特别有用。请注意,输入模块必须支持绑定到非标准规则集,因此所有输入可能无法使用该功能。

在本文档中,我使用的是imtcp,一个支持绑定到非标准规则集的输入模块,因为rsyslog开始支持它们。

什么是规则集?

如果你使用过(r)syslog.conf,你知道它是由我称之为规则的(其他人倾向于称之为选择器,一个sysklogd术语)。每个规则都包含一个过滤器以及当过滤器评估为true时要执行的一个或多个操作。过滤器可以像传统的基于syslog优先级的过滤器一样简单(如“*。*”或“mail.info”,也可以像脚本式表达式一样复杂。配置文件文档中介绍了详细信息。 filter是动作说明符,动作是对消息做某事的事情,例如将其写入文件或将其转发到远程日志记录服务器。

传统配置文件由一个或多个这些规则组成。当新消息到达时,其处理从第一个规则开始(按照rsyslog.conf中的出现顺序)并继续执行每个规则,直到所有规则都已处理或发生所谓的“丢弃”操作,在这种情况下处理停止并丢弃消息(在处理完最后一条规则后也会发生这种情况)。

现在,多规则集支持允许指定多个这样的规则序列。您可以将传统配置文件视为单个默认规则集,它自动绑定到每个输入。这甚至是实际发生的事情。处理rsyslog.conf时,配置文件解析器会查找该指令

ruleset (name = “rulesetname” );

其中name是用户喜欢的任何名称(但不能以“RSYSLOG_”开头,这是为rsyslog使用保留的名称空间)。如果它找到此指令,它将开始一个新的规则集(如果该名称尚不知道)或切换到已存在的规则集(如果名称已知)。此$ RuleSet指令与下一个指令之间定义的所有规则都附加到命名规则集。请注意,保留名称“RSYSLOG_DefaultRuleset”用于指定rsyslogd的默认规则集。您可以在任何可以使用规则集名称的位置使用该名称,包括将输入绑定到它时。

在规则集内部,如上所述处理消息:它们以第一个规则开始,并且按照配置文件的出现顺序处理规则,直到没有更多规则或执行丢弃操作为止。请注意,对于多个规则集,不再 执行所有 rsyslog.conf规则,而执行特定规则集中包含的规则。

输入必须显式绑定到规则集。如果没有,则绑定默认规则集。

这提出了下一个问题:

“绑定到规则集”是什么意思?

此术语的用法与“将IP地址绑定到接口”的意义相同:它表示特定输入或输入的一部分(如tcp侦听器)将使用特定规则集“将其消息传递给” 。因此,当新消息到达时,它将通过绑定规则集进行处理。所有其他规则集中的规则都是无关紧要的,永远不会被处理。

这使得多个规则集非常便于通过单独的方式处理本地和远程消息:将各个接收器绑定到不同的规则集,并且您不需要通过任何其他方法分隔消息。

绑定到规则集是特定于输入的。对于imtcp,这是通过

input (type = “imptcp”  port = “514”  ruleset = “rulesetname” );

指示。请注意,“rulesetname”必须是在给出bind指令时已定义的规则集的名称。有很多方法可以确保这种情况发生,但我个人认为最好在rsyslog.conf的顶部定义所有规则集并在底部定义输入。这种方式颠倒了传统的推荐顺序,但似乎是一种非常有用和直接的做事方式。

为什么规则集对于不同的解析器配置很重要?

用于处理不同(可能是其他方式无效)消息格式的自定义消息解析器可以绑定到规则集。因此,多个规则集可以是一种非常有用的方式来处理以一致方式发送不同格式错误格式的消息的设备。不幸的是,这在syslog世界中并不罕见。可以在$ RulesetParser配置指令中找到有关配置示例的深入说明 。

我可以使用不同的Ruleset作为默认值吗?

这可以通过使用

$ DefaultRuleset <name>

指示。但请注意,此指令实际上是全局的:即,它不会修改下一个输入绑定到的规则集,而是为那些未明确绑定到一个输入的输入提供系统范围的默认规则集。因此,该指令不能用作将输入绑定到不支持规则集绑定的非默认规则集的解决方法。

规则集和队列

默认情况下,规则集没有自己的队列。它必须通过$ RulesetCreateMainQueue指令激活,或者如果使用rainerscript格式,则通过在规则集指令上指定队列参数,例如

规则集(名称= “无所谓”  的队列。类型= “fixedArray”  队列。 ... )

有关 详细信息,请参阅http://www.ryslog.com/doc/master/rainerscript/queue_parameters.html

请注意,当规则集使用自己的队列时,规则集的处理与其余处理异步发生。因此,对消息对象所做的任何修改(例如,设置的消息或局部变量)或丢弃消息对象都不会影响该规则集。因此,如果要修改规则集内的消息对象,则无法 为其定义队列。最重要的是,您无法调用它并期望在调用返回时存在已修改的属性。更重要的是,在消息甚至开始由相关规则集处理之前,调用很可能会返回。

请注意,在RainerScript格式中,指定任何“queue。*”都可以导致创建专用队列并进行异步处理。这是因为没有队列就无法指定队列参数。但请注意,只有在如上所述指定“queue.type”时才能保证实际创建。因此,如果您有意要为规则集分配单独的队列,请执行此操作,如上所示。

示例

拆分本地和远程日志记录

假设您有一个非常标准的系统,它将本地消息记录到默认rsyslog.conf中指定的一堆文件中。例如,您的rsyslog.conf可能如下所示:

#... module loading ... 
#authpriv文件具有受限访问权限。
authpriv 。*   / var / log / secure 
#在一个地方记录所有邮件。
mail 。*       / var / log / maillog #Log 
cron stuff 
cron 。*       / var / log / cron 
#每个人都收到紧急消息
*。emerg      * 
...  更多 ......

现在,您希望从远程系统添加接收消息并将这些消息记录到特殊文件中,但您不希望将这些消息写入上面指定的文件。传统的方法是在所有其他人面前添加规则,过滤消息,处理消息然后丢弃它:

#...模块加载... 
#进程远程消息,
如果$ fromhost-ip =='192.0.2.1'然后{ 
        action(type =“omfile”file =“/ var / log / remotefile02”)
        stop 
    } #no 


messages而不是来自192.0.2.1使它超过这一点

#authpriv文件具有限制访问权限。
authpriv。* / var / log / secure 
#在一个地方记录所有邮件。
mail。* / var / log / maillog 
#Log 
cron stuff 
cron。* / var / log / cron 
#每个人都收到紧急消息* .emerg * 
...更多...

请注意,“停止”是丢弃操作!另请注意,我们假设192.0.2.1是唯一的远程发送方(为了保持简单)。

使用多个规则集,我们可以简单地为远程接收案例定义专用规则集并将其绑定到接收器。这可以写成如下:

#...模块加载... 
#进程远程消息
#define new ruleset并向其添加规则:
ruleset (name = “remote” ){ 
    action (type = “omfile”  file = “/ var / log / remotefile” )
} 
#only仅来自192.0.21的消息使得它超过了这一点#bin 

ruleset to tcp listener并激活它:
input (type = “imptcp”  port = “10514”  ruleset = “remote” )

拆分三个不同端口的本地和远程日志记录

这个例子几乎就像第一个例子,但它扩展了一点。虽然它非常相似,但我希望它足以提供一个有用的示例,为什么您可能希望拥有两个以上的规则集。

同样,我们只想使用“常规”日志文件进行本地日志记录。但是这次我们设置了三个syslog / tcp监听器,每个监听器监听一个不同的端口(在这个例子中为10514,10515和10516)。从这些接收器接收的日志应分成不同的文件。此外,从10516(并且仅从该端口!)收到的具有“mail。*”优先级的日志应写入特定文件,而不是写入10516的一般日志文件。

这是配置:

#... module loading ... 
#process remote messages 

ruleset (name = “remote10514” ){ 
    action (type = “omfile”  file = “/ var / log / remote10514” )
} 

ruleset (name = “remote10515” ){ 
    action (type = “omfile”  file = “/ var / log / remote10515” )
} 

ruleset (name = “remote10516” ){ 
    if  prifilt (“mail。*”)) 然后 { 
        / var / log / mail10516 
        stop 
        #注意,stop-command会阻止来自
        #的
    这条消息写入remote10516文件 - 像往常一样...... } 
    / var / log / remote10516 
} 


#并现在定义绑定到相关的侦听器规则集
输入(type = “imptcp”  port = “10514”  ruleset = “remote10514” )
输入(type = “imptcp”  port = “10515”  ruleset =“remote10515” )
输入(type = “imptcp”  port = “10516”  ruleset = “remote10516” )

表现

更少的过滤器

没有规则处理比完全不处理规则更快。因此,对于高性能系统来说,识别分离动作并尝试将它们分离到不同的规则集是有用的。在示例部分中,我们遇到了三个不同的tcp侦听器需要写入三个不同文件的情况。这是多个规则集更易于使用并提供更高性能的完美示例。性能更好只是因为不需要检查接收服务 - 而是消息被自动推送到正确的规则集,并且可以通过非常简单的规则处理(甚至可以使用“*。*” - 过滤器,最快的可用)。

输入数据的分区

从rsyslog 5.3.4开始,规则集允许更高的并发性。它们提供了在自己的“主”队列上运行的能力。这意味着自己的队列与特定的规则集相关联。这意味着绑定到该规则集的输入在将数据元素排入队列时不再需要彼此竞争。相反,排队操作可以并行完成。

一个例子:让我们假设我们有三个TCP侦听器。如果没有规则集,则每个规则集都需要将消息插入主消息队列。因此,如果他们每个人都希望同时将新到达的消息提交到队列中,则只有一个人可以这样做而其他人需要等待。使用多个规则集,可以为每个规则集创建自己的队列。如果现在每个侦听器都绑定到自己的规则集,则可以提交并发消息。在具有足够大的内核数量的机器上,这可以显着提高性能。

强烈建议高性能系统定义专用规则集,每个输入都有一个专用队列。

默认情况下,规则集没有自己的队列。必须通过$ RulesetCreateMainQueue 指令激活它 。

 

更多可以查询:https://www.rsyslog.com/doc/v8-stable/concepts/multi_ruleset.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值