4

一部の Python モジュールの集中ログ システムを作成しようとしています。多数のモジュールからログ付きのメッセージを送信できるようにしたいのですが、中央ロガーがそれらを受け取り、処理を行います。

ここに画像の説明を入力

簡単にするために、モジュール A を次のようにします。

  bus = connect_to_a_bus_that_is_always_there
  while True:
    #Publish a message to message bus, pseudo code
    bus.publish(topic="logs.a", message="example")
    time sleep(1)

およびロガー(唯一のサブスクライバー)

def actOnNewMessage(msg):
  if msg.topic.subtopic == "a":
     doSomethingForA(msg.data)

bus = connect_to_a_bus_that_is_always_there
bus.subscribe("logs", handler=actOnNewMessage)

while True:
  #wait for messages

現在、Logger モジュールはライブラリのように動作するため、永続的に実行されるわけではありません。そのため、Logger とメッセージ バスの間に新しいメッセージを常に監視する何かを導入できるかもしれません。

私はPyPubSubを見てきましたが、ドキュメントで実行中の異なる python モジュール間の永続的な通信を導入していないようです。誰かがこれを試した場合、異なるモジュール間でこれを使用できればうまくいきます。

もう 1 つの落とし穴は、Python で記述されていないモジュールになってしまう可能性があることです。そのため、モジュール A、B、および Logger の間で直接通信する必要はありません。最終的に、私のアーキテクチャは次のようになります。 ここに画像の説明を入力

上記の情報が混乱しないことを願っています。

tl;dr : Python の永続的なメッセージ バスと、新しいメッセージを常に待機しているサブスクライバーを使用したパブリッシュ-サブスクライブ。すぐに使えるソリューションはありますか?

編集: Logger モジュールを認識している Web ソケット サーバーを実行することを検討しており、他のモジュール A、B は Websocket のアドレスを認識しています。この設計に欠点はありますか?

4

3 に答える 3

1

Opensplice は、永続的なバッファリングされたデータ通信を可能にするメッセージ バスです。独自のメッセージ バスを展開しないでください。彼らは複雑な獣です。

単にsyslogを使用しないのはなぜですか? 複数のノードから中央収集ポイントへのロギングもサポートする syslog のバージョンがあります。Python を含む多くのプログラミング言語がこれをサポートしています。

標準の Python ロギング フレームワークを使用することを強くお勧めしますSyslogHandler、SocketHandler、DatagramHandler などのさまざまな標準ロガーを使用して、ログの保存先を選択できます。

必要に応じて、独自のハンドラーを作成することもできます...

于 2015-08-06T14:16:37.320 に答える