测试环境管理之线上日志实时收集过滤转发

发表于:2013-01-15来源:Anjuke QA Team作者:sdhou点击数: 标签:管理
测试环境管理之线上日志实时收集过滤转发。 生产环境的每台服务器每时每刻都在产生大量日志,每个工程师或多或少需要关注,我们希望为工程师提供方便快速的查看生产环境日志工具,还能为用log计算数据的job提供实时日志信息,我们为这个工具起名为 warden.

  生产环境的每台服务器每时每刻都在产生大量日志,每个工程师或多或少需要关注,我们希望为工程师提供方便快速的查看生产环境日志工具,还能为用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())

原文转自:http://www.ltesting.net