/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}」部分の前でより多くのフィールドを送信するのを見ることができます。