pyzmq和x27的使用;python中的日志处理程序
我想在Python程序中引入基于pyzmq和x27的使用;python中的日志处理程序,python,python-2.7,logging,zeromq,pyzmq,Python,Python 2.7,Logging,Zeromq,Pyzmq,我想在Python程序中引入基于zmq的登录。当我面临ZMQError:Address in use错误时,我决定将其归结为一个简单的概念证明。我能够运行简化版本,但没有收到任何日志条目。这是我使用的代码: 日志发布者: import time import logging from zmq.log import handlers as zmqHandler logger = logging.getLogger('myapp') logger.setLevel(logging.ERROR)
zmq
的登录。当我面临ZMQError:Address in use
错误时,我决定将其归结为一个简单的概念证明。我能够运行简化版本,但没有收到任何日志条目。这是我使用的代码:
日志发布者:
import time
import logging
from zmq.log import handlers as zmqHandler
logger = logging.getLogger('myapp')
logger.setLevel(logging.ERROR)
zmqH=zmqHandler.PUBHandler('tcp://127.0.0.1:12344')
logger.addHandler(zmqH)
for i in range(50):
logger.error('error test...')
print "Send error #%s" % (str(i))
time.sleep(1)
import time
import zmq
def sub_client():
port = "12344"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:%s" % port)
# Generate 30 entries
for i in range (30):
print "Listening to publishers..."
message = socket.recv()
print "Received error #%s: %s" % (str(i), message)
time.sleep(1)
sub_client()
结果
Send error #0
Send error #1
Send error #2
Send error #3
Send error #4
...
Listening to publishers...
日志订户:
import time
import logging
from zmq.log import handlers as zmqHandler
logger = logging.getLogger('myapp')
logger.setLevel(logging.ERROR)
zmqH=zmqHandler.PUBHandler('tcp://127.0.0.1:12344')
logger.addHandler(zmqH)
for i in range(50):
logger.error('error test...')
print "Send error #%s" % (str(i))
time.sleep(1)
import time
import zmq
def sub_client():
port = "12344"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:%s" % port)
# Generate 30 entries
for i in range (30):
print "Listening to publishers..."
message = socket.recv()
print "Received error #%s: %s" % (str(i), message)
time.sleep(1)
sub_client()
结果
Send error #0
Send error #1
Send error #2
Send error #3
Send error #4
...
Listening to publishers...
因此,用户在调用socket.recv()
时被锁定。我在不同的控制台上启动了publisher和subscriber。使用netstat时,两个进程都会出现:
C:\>netstat -a -n -o | findstr 12344
TCP 127.0.0.1:12344 0.0.0.0:0 LISTEN 1336
TCP 127.0.0.1:12344 127.0.0.1:51937 ESTABLISHED 1336
TCP 127.0.0.1:51937 127.0.0.1:12344 ESTABLISHED 8624
我看不出我的错误,有什么想法吗
除了手头的问题之外,我通常如何使用这个zmq侦听器。
我必须为每个进程创建一个PUBHandler
实例,然后将其添加到logger
的所有实例中(logging.getLogger('myapp')
创建自己的记录器实例,对吗?)还是必须为我使用的所有不同类创建自己的PUBHandler
?由于PUBHandler
类有一个createLock()
我假设它不是线程保存
为了完整起见,我想提一下
我在Win7上使用python(x,y)发行版和python 2.7.10和pyzmq 14.7.0-14
[更新]
我排除了windows防火墙是丢失软件包的来源的可能性我猜您没有在服务器中设置PUB套接字 像这样的事情应该可以
publisher = context.socket(zmq.PUB)
publisher.bind('tcp://127.0.0.1:12344')
zmqh = PUBHandler(publisher)
logger = logging.getLogger('myapp')
logger.setLevel(logging.ERROR)
logger.addHandler(zmqh)
我希望这能有所帮助。问题出在用户方面。最初,订户过滤掉所有消息,直到设置了过滤器。使用
socket.setsockopt(opt,value)
函数将其存档。
pyZMQ
说明中对该功能的使用不是很清楚:
getsockopt(opt)获取由创建的新套接字的默认套接字选项
这一背景
但是zmq_setsockopt
函数的文档非常清楚():
int-zmq\u setsockopt(void*socket,int-option\u名称,const-void*option\u值,size\u t option\u len)
ZMQ\u SUBSCRIBE
:建立消息过滤器ZMQ\u SUBSCRIBE
选项应在ZMQ\u SUB
套接字上建立新的消息过滤器。
新创建的ZMQ_SUB
插座应过滤掉所有输入
消息,因此您应该调用此选项以建立
初始消息过滤器
因此,解决方案是使用socket.setsockopt(zmq.SUBSCRIBE,filter)
设置一个过滤器,其中filter是要过滤的字符串。使用filter=''
显示所有消息。像filter='ERROR'
这样的过滤器将只显示错误消息,并抑制所有其他类型,如警告
、信息
或调试
使用此函数,sub_client()
函数如下所示:
import time
import zmq
def sub_client():
port = "12344"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:%s" % port)
socket.setsockopt(zmq.SUBSCRIBE,'')
# Process 30 updates
print "Listening to publishers..."
for i in range (30):
print "Listening to publishers..."
message = socket.recv()
print "Received error #%s: %s" % (str(i), message)
time.sleep(1)
sub_client()
我知道这是一个老帖子,但如果有人登陆这里,这就是订阅者的样子
def sub_client():
port = "12345"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:%s" % port)
socket.subscribe("")
# Process 30 updates
for i in range (30):
print("Listening to publishers...")
message = socket.recv()
print("Received error #%s: %s",str(i), message)
time.sleep(1)
sub_client()
import zmq
import logging
import time
from zmq.log.handlers import PUBHandler
port = "12345"
context = zmq.Context()
pub = context.socket(zmq.PUB)
pub.bind("tcp://*:%s" % port)
handler = PUBHandler(pub)
logger = logging.getLogger()
logger.setLevel(logging.ERROR)
logger.addHandler(handler)
for i in range(50):
logger.error('error test...')
print("publish error",str(i))
time.sleep(1)
出版商看起来像
def sub_client():
port = "12345"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:%s" % port)
socket.subscribe("")
# Process 30 updates
for i in range (30):
print("Listening to publishers...")
message = socket.recv()
print("Received error #%s: %s",str(i), message)
time.sleep(1)
sub_client()
import zmq
import logging
import time
from zmq.log.handlers import PUBHandler
port = "12345"
context = zmq.Context()
pub = context.socket(zmq.PUB)
pub.bind("tcp://*:%s" % port)
handler = PUBHandler(pub)
logger = logging.getLogger()
logger.setLevel(logging.ERROR)
logger.addHandler(handler)
for i in range(50):
logger.error('error test...')
print("publish error",str(i))
time.sleep(1)
@Akhay根据文件,
handler=PUBHandler('inproc://loc“)
应该相当于单独创建套接字并将其绑定到接口,但我会尝试一下。我尝试了您的建议,但这并没有改变任何事情。我在订户端仍然没有收到任何日志。好的,socket.subscribe(“”)是socket.setsockopt(zmq.subscribe,“”)的高级调用。很高兴知道,谢谢