Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pyzmq和x27的使用;python中的日志处理程序_Python_Python 2.7_Logging_Zeromq_Pyzmq - Fatal编程技术网

pyzmq和x27的使用;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)

我想在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)
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,“”)的高级调用。很高兴知道,谢谢