편집: 더 많은 배경.
다음과 같은 예가 있습니다.
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.tag1.log"여야 하는데 "192.168.1.1..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