814247614 发表于 2017-5-23 14:52:34

基于日志的统计

scribeutil.py

#coding=utf-8
#@author: panfei
try:
from scribe import scribe
from thrift.transport import TTransport, TSocket
from thrift.protocol import TBinaryProtocol
SCRIBE_AVAILABLE = True    # 检查scribe相关库正常,不要影响业务系统
except ImportError, e:
print e
SCRIBE_AVAILABLE = False
class Singleton(type):
'''this is a meta class for Singleton,just ommit it '''
def __init__(cls, name, bases, dic):
super(Singleton, cls).__init__(name, bases, dic)
cls.instance = None
def __call__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls.instance
class _Transport(object):
'''
use this class as a raw socket
'''
def __init__(self, host, port, timeout=None, unix_socket=None):
self.host = host
self.port = port
self.timeout = timeout # ms
self._unix_socket = unix_socket
self._socket = TSocket.TSocket(self.host, self.port, self._unix_socket)
self._transport = TTransport.TFramedTransport(self._socket)
def __del__(self):
self._socket.close()
def connect(self):
try:
if self.timeout:
self._socket.settimeout(self.timeout)
if not self._transport.isOpen():
self._transport.open()
else:
pass
except Exception, e:
self.close()
def isOpen(self):
return self._transport.isOpen()
def get_trans(self):
return self._transport
def close(self):
self._transport.close()
import time
class ScribeClient(object):
'''a simple scribe client'''
__metaclass__ = Singleton
def __init__(self, host, port, timeout=None, unix_socket=None):
self._transObj = _Transport(host, port, timeout=timeout, unix_socket=unix_socket)
self._protocol = TBinaryProtocol.TBinaryProtocol(trans=self._transObj.get_trans(), strictRead=False, strictWrite=False)
self.client = scribe.Client(iprot=self._protocol, oprot=self._protocol)
self._transObj.connect()

def log(self, category, message):
'''specify a category and send the message'''
message = time.strftime('%H:%M:%S') + '\t' + message # add timestamp before log
log_entry = scribe.LogEntry(category=category, message=message)
try:
self.client.Log()
except Exception, e:
self._transObj.close()
self._transObj.connect()
if self._transObj.isOpen():
self.client.Log()
else:
pass
@classmethod
def instance(cls):
'''create a Scribe Client'''
if not hasattr(cls, '_instance'):
cls._instance = cls()


static_api.py

#coding=utf8
import time
from django.conf import settings
from scribeutil import SCRIBE_AVAILABLE # 检查scribe是否可用
from scribeutil import ScribeClient
def scribesender(host, port, category_prefix=None):
scribe_client = ScribeClient(host, port)
def sender(data):
today = time.strftime('%Y-%m-%d')
category = category_prefix + '_' + today if category_prefix else today
scribe_client.log(category, data)
return sender
SCRIBE_SERVER = getattr(settings, 'SCRIBE_SERVER', '127.0.0.1')
SCRIBE_PORT = getattr(settings, 'SCRIBE_PORT', 8250)         
CATEGORY_PREFIX = getattr(settings, 'CATEGORY_PREFIX', '')
if SCRIBE_AVAILABLE:   # 如果scribe可用,则创建scribe的通道
output = scribesender(SCRIBE_SERVER, SCRIBE_PORT, CATEGORY_PREFIX)
else:
output = None
页: [1]
查看完整版本: 基于日志的统计