rsyslog 원격 로그 조건부 전달

rsyslog 원격 로그 조건부 전달

모든 원격 Linux syslog 및 네트워크 로그를 가져오는 다음 설정을 갖춘 rsyslog 서버가 있습니다.

# cat /etc/rsyslog.conf 
$ModLoad imudp
$UDPServerRun 514
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$template noida-dc, "/scratch/rsyslog/%HOSTNAME%/messages.log"
authpriv.*   ?noida-dc
*.info,mail.none,authpriv.none,cron.none   ?noida-dc
$IncludeConfig /etc/rsyslog.d/*.conf

Linux syslog는 호스트 이름 자체를 사용하여 디렉터리를 만든 다음 그 안에 호스트 이름의 로그를 저장하기 위한 메시지 파일을 만드는 방식으로 수행됩니다 /scratch/rsyslog. 괜찮습니다.

그런데 웹 로그를 분리하고 싶어서 기본적으로 월 이름으로 폴더를 만든 Jan Feb Mar다음 message.log폴더를 만드는데, 웹 로그에는 호스트 이름이 없기 때문에 그냥 나방 이름을 기준으로 디렉터리를 만들고 하나만 유지하면 됩니다. 파일 그게 전부입니다 messages.log. 제가 원하는 것은 이러한 웹 로그를 다른 디렉토리(예: /scratch/network.

다음은 네트워크 로그 디렉터리의 메시지 형식입니다.Dec

Dec  2 19:04:22 Dec 02 13:34:22.768 cisco-apic-1 %LOG_-3-SYSTEM_MSG

따라서 원격 메시지 Dec에 .Jan/scratch/network

다음을 시도했지만 작동하지 않습니다.

$template mynets,"/scratch/network/%HOSTNAME%/messages.log"
if $fromhost contains 'cisco-apic-1' then -?mynets
& stop

&

$template mynets,"/scratch/network/%HOSTNAME%/messages.log"
if $fromhost startswith 'Dec' then -?mynets
& stop

Linux 배포판은 Centos 6입니다.

답변1

나는 당신의 의도를 완전히 이해하지 못한다는 것을 인정합니다. 그래도 해결책이 있을 수 있습니다.

첫째, "Dec", "Jan" 등은 일반적으로 전통적인 RFC3164 syslog인 경우에만 syslog 헤더로 반환됩니다. 최신 시스템에는 해당 지침이 없습니다. 또한 많은 시스템이 syslog 표준을 위반하므로 메시지에서 이러한 문자열을 찾지 못할 수도 있습니다.

존재한다고 가정하고 syslog 헤더에 있다고 가정합니다. 그러면 $msg 또는 $fromhost의 일부가 아닙니다. 원활하고 간단하게 하려면 네트워크에 보이는 메시지인 $rawmsg만 확인하면 됩니다. 이는 구문 분석되지 않은 형식으로 이러한 문제를 처리하는 데 좋지 않은 방법이지만 전체 이론을 이해하지 않고도 작동한다는 이점이 있습니다.

그래서 당신은 말할 수 있습니다 :

$template mynets,"/scratch/network/%HOSTNAME%/messages.log"
if $rawmsg contains 'Dec ' then -?mynets
& stop

"Dec" 뒤에 공백을 하나 이상 추가했다는 점에 유의하세요. 그렇지 않으면 해당 문자열(예: "Decimal")을 포함하는 모든 항목과 일치하기 때문입니다.

이것은 효과가 있을 수 있지만 당연하게 여겨서는 안되는 많은 것들에 달려 있습니다. 더 나은 접근 방식은 $fromhost-ip가 localhost와 다른지 확인하는 것입니다. 또는 원격 로깅을 위한 전용 규칙 세트를 만드는 것이 더 좋습니다. 하지만 이는 원래 질문에 맞지 않으므로 무시하도록 하겠습니다.

관련 정보