生產環境的每臺服務器每時每刻都在產生大量日志,每個工程師或多或少需要關注,我們希望為工程師提供方便快速的查看生產環境日志工具,還能為用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.anti-gravitydesign.com