Rhel

rsyslog:你能檢查兩個局部變數是否相等嗎?

  • May 13, 2020

編輯:更多上下文。

我有以下範例:

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”不會導致錯誤。

使該比較起作用的正確條件語句是什麼?

我嘗試了一個更簡單的例子,在規則集之外設置一個局部變數,然後在規則集中訪問它,它的值為空。我認為這是一個功能,使規則集空間更加獨立。

我不確定對此能做些什麼,也沒有任何合適的反例。$!varjson 樣式的變數也是如此。規則集概念中沒有提到這一點。

您獲得的廣泛調試確認了規則集之外的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

引用自:https://unix.stackexchange.com/questions/586219