/etc/rsyslog.d/40-filter.conf 파일에 {FILTER}가 포함된 메시지를 리디렉션하는 규칙을 만들었습니다.
:msg,contains,"{FILTER}" /var/log/filter.log
& ~
/etc/rsyslog.conf 파일을 편집하여 해당 줄의 주석 처리를 제거하여 원격 UDP 메시지를 허용하도록 했습니다.
$ModLoad imudp
$UDPServerRun 514
내 syslog 메시지의 소스는 다음과 같은 간단한 Python 스크립트입니다.
#! /usr/bin/python
import logging
import logging.handlers
logger = logging.getLogger('LoggingTest')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('{FILTER} %(message)s')
handler = logging.handlers.SysLogHandler()
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("Test Message")
다음을 사용하여 rsyslog를 다시 시작합니다.
sudo service rsyslog restart
스크립트를 실행하면 /var/log/messages, /var/log/syslog 및 /var/log/user.log에 다음 줄이 표시되지만 /var/log/filter.log에는 표시되지 않습니다. 로그가 존재하지만 비어 있습니다.
Jun 23 17:18:29 {FILTER} Test Message
명령줄 도구 "로거"(아래 명령줄 예)를 사용하면 규칙이 올바르게 적용됩니다.
$ logger "{FILTER} Test Message 2"
$ cat /var/log/filter.log
Jun 23 17:21:28 NDU1010 nick: {FILTER} Test Message 2
내 Python 스크립트의 메시지에 이 규칙이 적용되지 않는 이유는 무엇입니까? 나는 이것을 설명할 수 없다.
답변1
귀하가 제공한 출력에 따르면 Python 스크립트가 rsyslog가 예상하는 모든 syslog 메시지 조각을 보내지 않는 것 같습니다. "{FILTER}" 부분에 호스트 및 애플리케이션 이름이 있어야 하는 것 같습니다. -d 플래그를 사용하여 rsyslogd를 실행한 다음 Python과 로거에서 메시지를 보내면 이를 쉽게 증명할 수 있습니다. 소켓의 원시 메시지를 볼 수 있으며 로거가 "{FILTER}" 부분 앞에 더 많은 필드를 보내는 것을 볼 수 있을 것입니다.