omprog はスクリプト出力をファイルとしてキャプチャしません。

omprog はスクリプト出力をファイルとしてキャプチャしません。

モジュールがスクリプトの出力をファイルにキャプチャするためにパラメータを使用しないようomprogな問題が発生しました。私は何が間違っていましたか?rsyslogoutput

私のrsyslogサーバーは外部ホストから毎秒12個のsyslogメッセージを受け取り、メッセージが特定の条件を満たすときに特定のタスクを実行したいと思います。そのため、特定の条件をスキャンしてstdinタスクを実行するPythonスクリプトを作成しました。 (これは約数時間ごとにトリガーされます。)他のすべてのメッセージの場合、Pythonスクリプトはメッセージを削除して受信し続けます。パイプが開くと、Pythonスクリプトは無期限に実行されます。すべて完璧です。

stdout次に、Pythonスクリプトの起動時に「開始済み」メッセージを出力し、ジョブが発生したstdoutときに「完了」メッセージを出力するように、いくつかの確認メッセージをPythonスクリプトに追加しました。omprogパラメータconfirmMessagesをに設定offし、outputパラメータを/var/log。出力はgetenforceSELinuxがダウンしたことを知らせます。再起動すると、rsyslogファイルは生成されず、出力はキャプチャされません。

だからtouch私はsyslogユーザーとしてファイルを編集して再起動しましたが、rsyslog問題は解決しませんでした。実行すると、systemctl status rsyslogPythonスクリプトが実行中であることを示します。スクリプトを見ると、特定のメッセージが実行されていることを確認できます。

Pythonスクリプトを手動で実行すると、出力が生成され、Ctrl+を押すまで無期限に保持されますD

stderrまた、stdoutこれが違いを生み出すようにPythonスクリプト出力を設定しました。再起動後もrsyslog出力ファイルはありません。

システム:Ubuntu 20.04.2 LTS

rsyslogd:version 8.2001.0

rsyslog 構成:

module(load="omprog")
if $fromhost-ip == '10.200.25.5'     then {
  action(type="omfile"
    file="/var/log/network")
  action(type="omprog"
    name="rsyslog_watch_vpn_attach"
    binary="/usr/share/rsyslog/watch_syslog_vpn_attach.py"
    confirmMessages="off"
    output="/var/log/watch_vpn_attach.log")
  stop
}

ファイル/var/log/networkをビルドしています。ファイル/var/log/watch_vpn_attach.logが構築されていません。

私が間違っていることを知っている人はいますか?

答え1

これはPythonプログラムのバッファリングの問題かもしれません。簡単な解決策は、flush=True次の印刷ステートメントを追加することです。

#!/usr/bin/python3
import sys,time
for data in sys.stdin:
    print(f"got data at {time.asctime()}: {data}",flush=True)

関連情報