3

zeromq コードをデバッグしていて、ソケット インスタンスの send/recv をログに記録したいと考えています。言い換えれば、私は

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5000")

そして、コードの他の場所でソケットインスタンスの send/recv を何らかの方法でログに記録したいと思います。

ここに何かアイデアはありますか?どこから始めればよいかわかりません。

4

1 に答える 1

3

すべてのメッセージをログに記録するSocketオブジェクトの例を次に示します。

ロギングのインポート
インポート時間
zmqをインポートする

クラスLogSocket(object):
    ソケット=なし
    ログ=なし
    名前=なし

    def __init __(self、socket、log = None、name = None):
        "" "ソケットをラップして、send/recv_multipartがメッセージをログに記録するようにします"""
        self.socket=ソケット
        ログがNoneの場合:
            logging.basicConfig(level = logging.INFO)
            log = logging.getLogger()。info
        self.log = log

        名前がNoneの場合:
            name = s.identityまたはrepr(s)
        self.name = name

    def send_multipart(self、msg、* args、** kwargs):
        self.log( "%s送信:%r"%(self.name、msg))
        self.socket.send_multipart(msg、* args、** kwargs)を返します

    def recv_multipart(self、* args、** kwargs):
        msg = self.socket.recv_multipart(* args、** kwargs)
        self.log( "%s受信:%r"%(self.name、msg))
        メッセージを返す

    def __getattr __(self、key):
        getattr(self.socket、key)を返します


ctx = zmq.Context.instance()

s = ctx.socket(zmq.REQ)
s.connect( "tcp://127.0.0.1:5556")

#zmqソケットをLoggingオブジェクトでラップします。
#このオブジェクトは、とまったく同じインターフェイスを持っています
s = LogSocket(s、name = "REQ")

range(5)のiの場合:
    time.sleep(1)
    s.send_multipart(['hello'、'world'])
    返信=s.recv_multipart()
    #この場合、_multipartメソッドのみがログに記録されるため、直接のsend/recvはログに記録されません。
    s.send( "quiet")
    s.recv()

シリアル化/ロギング/認証などをすべて1か所で処理するためのセカンダリオブジェクトの例は、IPythonのSessionオブジェクトです。これは、この単純なケースよりもかなり複雑ですが、すべてのメッセージング抽象化をあなたのコード。

于 2012-05-03T23:49:46.103 に答える