用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()

更多相关文章
一周排行
  • mongodb监控工具mongosniff 介绍 mongosniff提供了对数据库实时活动的低级别操作跟踪和嗅探视图.可以将mongosniff认为是专为MongoDB定制的,类似于tcpdump用于TCP/IP网 ...
  • 执行以下命令: echo "options asus_nb_wmi wapf=4" sudo tee /etc/modprobe.d/asus_nb_wmi.conf 重启
  • dell r710xd 通過遠程管理卡安裝系統
    机器dell r720xd 服务器 远程管理卡:iDRAC7 安装系统CentOS 5.9
  • 对于iphone开发人员来说,内存管理是极为重要的技巧,哪怕程序的功能再强大,设计再漂亮,如果内存控制不好,也难逃程序莫名退出的噩运,这与网页开发是完全不同的. 内存控制里面有很多门道,在这里分析一下 viewDid
  • 2. 滑雪录像{silver题3} [问题描述]    冬奧会的电视时刻表包含N (1 <= N <= 150)个节目,每个节目都有开始和结束时间.农民约翰有两台录像机,请计算他最多可以录制多少个节目. ...
  • 这些个词没有太大区别,有时候有些词是可以通用的,而有些用法则是随着地域时间的不同而变迁.一般说来,college译作“学院”,它是university (综合性大学)的一个组成部分,例如,一所综合大学里设有文学院.理
  • 最近打算实现一个功能:在Android中加载显示Word文档,当然这里不是使用外部程序打开.查看一些资料后,打算采用poi实现,确定了以下实现思路: 将ftp中的word文档下载到本地. 调用poi将word文档转成
  • import java.io.File; import java.util.*; import jxl.*; import jxl.write.*; /** * <p>Title: 操作EXCEL文件&l ...
  • 环境: 系统 CentOS 6.2 32位 软件 apache-2.2.21 软件包位于/root/src 安装目录为/usr/local/apache 安装必须的apr ,apr-util ,prce, #cd / ...
  • AE基礎(3)
    1 using ESRI.ArcGIS.Controls; 2 using System;