Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

23.3. 使用新配置格式

rsyslog 版本 7 中,默认为 Red Hat Enterprise Linux 7 安装在 rsyslog 软件包中,引入了新的配置语法。这种新的配置格式旨在通过不允许某些无效构造来更强大、更直观,并防止常见错误。语法增强由依赖于 RainerScript 的新配置处理器启用。旧格式仍被完全支持,它在 /etc/rsyslog.conf 配置文件中默认使用。

RainerScript 是脚本语言,设计用于处理网络事件和配置事件处理器,如 rsyslog。RainerScript 首先用于定义基于表达式的过滤器,请参阅 例 23.3 “基于表达式的过滤器”。rsyslog 版本 7 中的 RainerScript 版本实施了 input()ruleset() 语句,允许使用新语法编写 /etc/rsyslog.conf 配置文件。新语法的主要区别在于,它的结构更强;参数作为参数传递到语句,如输入、操作、模板和模块加载。选项的范围受块限制。这增强了可读性,并减少了配置错误导致的错误数量。性能也显著提高。部分功能在两种语法中都公开,有些功能仅在新语法中公开。

将编写的配置与旧式参数进行比较:

$InputFileName /tmp/inputfile
$InputFileTag tag1:
$InputFileStateFile inputfile-state
$InputRunFileMonitor

以及使用新 format 语句的相同配置:

input(type="imfile" file="/tmp/inputfile" tag="tag1:" statefile="inputfile-state")

这可显著减少配置中使用的参数数量,提高可读性,还提供更高的执行速度。有关 RainerScript 语句和参数的详情请参考 “在线文档”一节

23.3.1. ruleset

保留特殊指令时,r syslog 会按照 规则 的定义处理消息,该规则由过滤器条件组成,并在条件为 true 时要执行的操作。使用传统编写的 /etc/rsyslog.conf 文件,会按照每条输入消息的外观对所有规则进行评估。这个过程以第一个规则开始,持续到所有规则都已处理或消息被其中一个规则丢弃为止。

但是,规则可以分组为多个序列,称为规则集。使用规则集时,您可以通过定义一组绑定到特定输入的不同操作集,将某些规则的效果限制为所选输入或提高 rsyslog 的性能。换而言之,可以跳过某些类型消息中无可避免评估为假的过滤条件。/etc/rsyslog.conf 中的旧规则集定义如下所示:

$RuleSet rulesetname
rule
rule2

当定义了另一个规则,或者调用默认规则集时,该规则会结束,如下所示:

$RuleSet RSYSLOG_DefaultRuleset

对于 rsyslog 7 中的新配置格式,因此为此操作保留了 input()ruleset() 语句。/etc/rsyslog.conf 中的新格式规则集定义如下所示:

ruleset(name="rulesetname") {
   rule
   rule2
   call rulesetname2
   …
}

rulesetname 替换为规则集的标识符。ruleset 名称不能以 RSYSLOG_ 开始,因为此命名空间保留给 rsyslog 使用。RSYSLOG_DefaultRuleset 然后,如果消息没有分配其他规则集,则定义要执行的默认规则集。使用 规则和 rule2,您可以使用上述过滤器操作格式定义规则。使用 call 参数时,您可以通过从其他规则集块中调用它们来嵌套规则集。

创建规则集后,您需要指定它将应用到哪些输入:

input(type="input_type" port="port_num" ruleset="rulesetname");

此处您可以通过 input_type (即收集消息的输入模块)或 port_num - 端口号来识别输入消息。可以为 input() 指定 文件或 标签 等其他参数。将 rulesetname 替换为针对消息评估的规则集的名称。如果没有显式绑定到规则集,则会触发默认规则集。

您还可以使用旧格式来定义规则集,如需更多信息,请参阅 “在线文档”一节

例 23.11. 使用 ruleset

以下规则集确保对来自不同端口的远程消息进行不同的处理。在 /etc/rsyslog.conf 中添加以下内容:

ruleset(name="remote-6514") {
  action(type="omfile" file="/var/log/remote-6514")
}

ruleset(name="remote-601") {
  cron.* action(type="omfile" file="/var/log/remote-601-cron")
  mail.* action(type="omfile" file="/var/log/remote-601-mail")
}

input(type="imtcp" port="6514" ruleset="remote-6514");
input(type="imtcp" port="601" ruleset="remote-601");

上例中所示的规则集从两个端口定义远程输入的日志目的地,如果是端口 601,则消息按照设备进行排序。然后,TCP 输入被启用并绑定到 ruleset。请注意,您必须加载所需的模块(imtcp)才能使此配置正常工作。

23.3.2. 与 sysklogd 的兼容性

通过 -c 选项指定的兼容性模式存在于 rsyslog 版本 5 中,但不存在于版本 7 中。此外,sysklogd 风格的命令行选项已弃用,应避免使用这些命令行选项配置 rsyslog。但是,您可以使用多个模板和指令将 rsyslogd 配置为模拟类似于 sysklogd 的行为。

有关各种 rsyslogd 选项的更多信息,请参阅 rsyslogd(8)手册页