生产环境的每台服务器每时每刻都在产生大量日志,每个工程师或多或少需要关注,我们希望为工程师提供方便快速的查看生产环境日志工具,还能为用log计算数据的job提供实时日志信息,我们为这个工具起名为 warden.
开发warden用到的工具:
-python 简洁实用的语言,很多人喜欢他,我们的口号是没有$,没有花括号.
-zeromq 快速简洁的异步消息队列,相关使用后面还有详细介绍.
-supervisord 用来做生产环境守护进程
-yaml 表达性很强的配置文件格式,还有很好用的支持库PyYAML,不用自己实现配置文件解析.
(啊什么?你安装python环境很麻烦?zeromq运行不了?你还在用windows?赶快投入linux的怀抱吧,强烈推荐ubuntu.)
warden的三个部件
wardend:收到日志消息后广播给中间节点,用系统标准输入stdin接收日志信息,与中间节点socket connect模式连接,用zeromq pub模式广播消息,当然消息发出来前做了一次压缩.
sample code:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Wardend:
__sock = None __hostname = None def __init__(self, connectInfo): self.__hostname = socket.gethostname() context = zmq.Context() self.__sock = context.socket(zmq.PUB) self.__sock.setsockopt(zmq.IDENTITY, socket.gethostname()) self.__sock.connect(connectInfo) def loop(self): while 1: msg = sys.stdin.readline() zmsg = zlib.compress(msg, 9) self.__sock.send_multipart([self.__hostname, zmsg]) |
warden-aggr:中间节点,在需要的地方转发和过滤消息,与wardend建立socket bind连接,使用zeromq sub模式接收wardend广播的消息后转发给warden.
sample code:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class WardenAggr:
__sockpub = None __socksub = None def __init__(self, bindRecv, bindSend): context = zmq.Context() self.__socksub = context.socket(zmq.SUB) self.__socksub.bind(bindRecv) self.__socksub.setsockopt(zmq.SUBSCRIBE, '') self.__sockpub = context.socket(zmq.PUB) self.__sockpub.bind(bindSend) def loop(self): while 1: self.__sockpub.send_multipart(self.__socksub.recv_multipart()) |