编辑:更多背景。
我有以下示例:
set $.dev1IP = 192.168.1.1;
set $.dev2IP = 192.168.1.2;
set $.dev3IP = 192.168.1.3;
set $.sourceIP = $fromhost-ip;
set $.sourceTag = "";
template(name="temp1" type="string" string="/path/to/logDir/%.sourceIP%/%.sourceIP%.%.sourceTag%.log")
ruleset(name="rules1") {
if ($.sourceIP == $.dev1IP) then {
set $.sourceTag = "tag1";
do something
} else if ($.sourceIP == $.dev2IP) then {
set $.sourceTag = "tag2";
do something
} else if ($.sourceIP == $.dev3IP) then {
set $.sourceTag = "tag3";
do something
} else {
do something if nothing else matches
}
action(type="omfile" dynaFile="temp1")
}
这是一个更完整的代码块,用于展示我如何知道它不起作用。我有来自这些 IP 地址的日志,但生成的动态文件名为“192.168.1.1..log”,而它应该命名为“192.168.1.1.tag1.log”。
运行“rsyslogd -N1 -f /etc/rsyslog.conf”不会出现错误。
使比较有效的正确条件语句是什么?
答案1
我尝试了一个更简单的示例,在规则集外部设置一个局部变量,然后在规则集内部访问它,它的值为空。我认为这是一个功能,可以使规则集空间更加独立。
我不确定对此能做些什么,而且我没有任何合适的反例。$!var
json 风格的变量也是如此。中没有提到这一点规则集概念。
您获得的广泛调试确认了规则集外部的rsyslog -dn
变量集如何位于规则集内部,以评估规则集内部的设置位置:set $.var1 = "abc";
(null)
if($.var1 == $.mydir)...
$.mydir
eval expr 0x556bdce30480, return datatype 'S':0
IF
var '.var1'
==
var '.mydir'
eval expr 0x556bdce30560, type 'CMP_EQ'
eval expr 0x556bdce30390, type 'V'
rainerscript: (json/string) var 202: '(null)'
eval expr 0x556bdce30390, return datatype 'S':0
eval expr 0x556bdce1e2b0, type 'V'
rainerscript: (json/string) var 202: 'abc'
if condition result is 0