정규 표현식을 사용하여 문자열을 rsyslog 경로로 캡처할 수 있나요?

정규 표현식을 사용하여 문자열을 rsyslog 경로로 캡처할 수 있나요?

각 사용자 ID에 대해 다른 파일을 사용하도록 로그를 필터링한다고 가정하면 다음과 같이 각 uid에 대한 규칙을 작성할 수 있습니다.

if $msg contains 'uid=500' then /var/log/uid/500
if $msg contains 'uid=501' then /var/log/uid/501
if $msg contains 'uid=502' then /var/log/uid/502

다음과 같이 정규식 캡처를 사용하여 한 줄을 작성하고 싶습니다.

if $msg contains 'uid=\([0-9]+\)' then /var/log/uid/\1

할 수 있나요?

답변1

당신은 그것을 사용할 수 있습니다부동산 대체품. 귀하 rsyslog.conf또는 유사한 라인을 원하는 파일 이름 형식의 템플릿으로 정의하고 입력 라인을 일치시킬 때 작업에 사용합니다. 예를 들어,

$template myfile,"/var/log/uid/%msg:R,ERE,1,FIELD:.*?uid=([0-9]+).*--end%"
if (re_match($msg, "uid=[0-9]+")) then {
 action(type="omfile" dynaFile="myfile")
 stop
}

템플릿 표현 템플릿 변수 myfile는 정규식(R) 일치, 확장(ERE), 그룹 캡처 1(1) msg(또는 일치하는 항목이 없는 경우 원래 필드 유지)로 대체된 속성을 포함하는 문자열입니다. 실제 정규 표현식은 이 .*?uid=([0-9]+).*부분입니다. 이는 --end시퀀스의 필수 부분입니다 %...:R,...--end%.

아래 줄은 일치시키려는 줄과 결과가 배치되는 위치에 대한 일반적인 Rainer 스크립트 테스트입니다.

관련 정보