2012-05-03 58 views
2

我正在調試一些zeromq代碼,我想記錄套接字實例send/recv。換句話說,我有log zmq socket實例send/recv?

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

我想以某種方式在代碼中的其他地方記錄套接字實例的send/recv。

這裏的任何想法?我不確定從哪裏開始。

+0

你的應用程序喜歡什麼?我通常將send/recv/serialization邏輯包裝在一個單獨的對象中,這樣我就有''session_object.send(socket,message)''的代碼。這使我可以將序列化/認證/日誌記錄全部放在一個地方,並將它與Socket對象本身分開。 – minrk

回答

3

下面是記錄每個消息Socket對象的示例:

 

import logging 
import time 
import zmq 

class LogSocket(object): 
    socket = None 
    log = None 
    name = None 

    def __init__(self, socket, log=None, name=None): 
     """wrap a socket so send/recv_multipart log their messages""" 
     self.socket = socket 
     if log is None: 
      logging.basicConfig(level=logging.INFO) 
      log = logging.getLogger().info 
     self.log = log 

     if name is None: 
      name = s.identity or repr(s) 
     self.name = name 

    def send_multipart(self, msg, *args, **kwargs): 
     self.log("%s sending: %r" % (self.name, msg)) 
     return self.socket.send_multipart(msg, *args, **kwargs) 

    def recv_multipart(self, *args, **kwargs): 
     msg = self.socket.recv_multipart(*args, **kwargs) 
     self.log("%s received: %r" % (self.name, msg)) 
     return msg 

    def __getattr__(self, key): 
     return getattr(self.socket, key) 


ctx = zmq.Context.instance() 

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

# wrap the zmq socket in the Logging object: 
# this object has exactly the same interface as 
s = LogSocket(s, name="REQ") 

for i in range(5): 
    time.sleep(1) 
    s.send_multipart(['hello', 'world']) 
    reply = s.recv_multipart() 
    # in this case, only _multipart methods are logged, so straight send/recv are not: 
    s.send("quiet") 
    s.recv() 

用於處理序列/記錄/認證等在同一個地方的第二個目標的一個例子是在IPython中,所述Session object這比這個簡單的例子複雜得多,但它允許你集中代碼中的所有消息抽象。

+0

優秀的答案!再次感謝。 – reckoner