用zeromq的PUB/SUB網路模型擴充python logging

zeromq是一个快速的通讯库。有好几个语言的扩展綁定。今天用它的python扩展库,为标准的logging库实现一个ZMQPUBHandler。
使用这个ZMQPUBHandler,能监听机器的某端口,然后将log信息发布(zmq.PUB)到那端口。用zeromq实现的好处是,代码实现简单,信息发布socket只是不断发送数据就行,不用理会是否有人订阅这些信息;允许多个订阅(zmq.SUB)客户连接过来,订阅的代码实现也很简单,都不需要考虑断开连接的问题。
Python语言: 用zeromq的PUB/SUB网络模型扩充python logging
import os, sys, types
import zmq, logging
import time

class ZMQPUBHandler(logging.Handler):
def __init__(self, host, port):
logging.Handler.__init__(self)
ctx = zmq.Context(1,1)
self.sock = ctx.socket(zmq.PUB)
self.sock.bind('tcp://%s:%s' %(host, port))

def emit(self, record):
"""
Emit a record.

If a formatter is specified, it is used to format the record.
The record is then written to the stream with a trailing newline
[N.B. this may be removed depending on feedback]. If exception
information is present, it is formatted using
traceback.print_exception and appended to the stream.
"""
try:
msg = self.format(record)
fs = "%s\n"
if not hasattr(types, "UnicodeType"): #if no unicode support...
self.sock.send(fs % msg, zmq.NOBLOCK)
else:
try:
self.sock.send(fs % msg, zmq.NOBLOCK)
except UnicodeError:
self.sock.send(fs % msg.encode("UTF-8"), zmq.NOBLOCK)
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)

def main():
#订阅
host = sys.argv[1]
ctx = zmq.Context(1, 1)
sock = ctx.socket(zmq.SUB)
sock.setsockopt(zmq.SUBSCRIBE, '')
sock.connect('tcp://%s:55555' % host)

while 1:
msg = sock.recv(zmq.NOBLOCK)
if msg:
print msg,
else:
time.sleep(0.1)

if __name__ == '__main__':
main()

更多相关文章
一周排行
  • 


    		    安裝Exchange 2010
    安装Exchange 2010 吴玉章 Exchange 2010 是微软即Exchang ...
  • 


    		    centos 6.4 NTP伺服器的搭建過程
    一.声明: 操作系统:cenots 6.4 server IP: 192.168.0.19 ...
  • 题意: 给出一个最大为16×16的迷宫图和至多3个ghost的起始位置和目标位置,求最少经过几轮移动可以使三个ghost都到达目标位置.每轮移动中,每个ghost可以走一步,也可以原地不动,需要注意的是任意两个gho ...
  • 以前我们做了分析过程,这一次,我们都参与了类做梳子,两个可以一起关注一下一起合并,整个方案的实施是有幫助. BaseClientApplication APP基类,一切APP都基于这个类 StreamsManager ...
  • 40:我注定是要做IT的 1987年的时候,田军就读的长沙交通学院(今长沙理工大学)只有一台PC IBM8086,10MHDD,而他所学的汽车运用工程专业也与IT完全无关,但这些却并不妨礙他多年后成为广州期货IT圈里
  • 前两周的作业比较简单,轻松搞定,这周的作业突然难起来了,费了好大劲儿写完,还有很多需要改进的地方,目前只能算是勉强实现了功能. 需求: HOMEWORK: HOMEWORK 3.1 Download the stud ...
  • 一个浏览器窗口有一个window对象,javascript属于window对象,html为document对象,属于window,body为document对象,只有设置body对象高度为100%,其他地方的高度设置
  • 


    		    cetos5.5搭建論壇
    实验环境 centos-5.5 实验软件包 yum install -y zlibc gd
  • Update-CsUserDatabase Update-CsAddressBook Export-CsConfiguration -FileName c:\configuration.zip 本文出自 " ...
  • 在.htaccess文件中增加301跳转 #强制重定向到www RewriteEngine On RewriteCond %{HTTP_HOST} ^abc.com [NC] RewriteRule ^(.*)$ h ...