下载pyinotify,解压 ./setup.py install
#!/usr/bin/env python #-*- encoding:UTF-8 -*- import os import sys from subprocess import * from pyinotify import WatchManager,Notifier,ProcessEvent,IN_DELETE,IN_CREATE,IN_MODIFY from scribe import scribe from thrift.transport import TTransport, TSocket from thrift.protocol import TBinaryProtocol g_linesNum = 0 global client # 发送消息 def PostMsg(lineStr): global client log_entry = scribe.LogEntry(category=sys.argv[3], message=lineStr) result = client.Log(messages=[log_entry]) # 事件处理 class EventHandler(ProcessEvent): def process_IN_MODIFY(self,event): global g_linesNum print "Modify file: %s " % os.path.join(event.path,event.name) linesNum = 0 if (event.name == sys.argv[1]): file = Popen("wc -l " + sys.argv[1],stdout=PIPE,shell=True).stdout linesNum = int(file.readline().split()[0]) file.close() if (linesNum > g_linesNum): disLine = str(linesNum - g_linesNum) file = Popen("tail -" + disLine + ' ' + sys.argv[1],stdout=PIPE,shell=True).stdout linesStr = file.readlines() file.close() for lineStr in linesStr: PostMsg(lineStr) g_linesNum = linesNum def process_IN_DELETE(self,event): print "Delete file: %s " % os.path.join(event.path,event.name) def process_IN_CREATE(self,event): print "Create file: %s " % os.path.join(event.path,event.name) # 初始化处理 def ReadFile(path): global g_linesNum for lineStr in open(sys.argv[1],'rb'): g_linesNum += 1 PostMsg(lineStr) # 监控文件目录变化 def FSMonitor(path='.'): wm = WatchManager() mask = IN_MODIFY notifier = Notifier(wm,EventHandler()) wm.add_watch(path,mask,rec=True) while True: try: notifier.process_events() if notifier.check_events(): notifier.read_events() except KeyboardInterrupt: notifier.stop() break # 主程序 if __name__ == "__main__": global client if (len(sys.argv) < 4): print "Usage:./watcher.py watchFileName host category" sys.exit(-1) host_port = sys.argv[2].split(':') host = host_port[0] if len(host_port) > 1: port = int(host_port[1]) else: port = 1463 socket = TSocket.TSocket(host=host,port=port) transport = TTransport.TFramedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocol(trans=transport, strictRead=False, strictWrite=False) client = scribe.Client(iprot=protocol, oprot=protocol) transport.open() ReadFile(sys.argv[1]) FSMonitor() transport.close()
转载请注明:爱开源 » python 加 scribe 监控文件变化