#-*- coding: utf-8 -*-
'''Created on 2012-06-14 19:50
@summary: a simple logging server. use gevent and logging modules
@author: JerryKwan'''
importosimportpickleimportloggingimportlogging.handlersimportstructfrom gevent.server importStreamServer#logger collection
_loggers_ ={}defget_logger(address, name):
address= address.replace(".", "_")
logger_name= address + "_" +nameif_loggers_.has_key(logger_name):return_loggers_[logger_name]else:print os.path.dirname(__file__)
logs_dir= os.path.join(os.path.dirname(__file__), "logs", address)if os.path.exists(logs_dir) andos.path.isdir(logs_dir):pass
else:
os.makedirs(logs_dir)
file_name= os.path.join(logs_dir, name+".log")#print file_name
#define a rotating file handler
rotatingFileHandler = logging.handlers.RotatingFileHandler(filename =file_name,
maxBytes= 1024 * 1024 * 50,
backupCount= 5)
formatter= logging.Formatter("%(message)s")
rotatingFileHandler.setFormatter(formatter)
console=logging.StreamHandler()#console.setLevel(logging.NOTSET)
#set a format which is simple for console use
formatter = logging.Formatter("%(message)s")#tell the handler to use this format
console.setFormatter(formatter)
logger=logging.getLogger(logger_name)
logger.addHandler(rotatingFileHandler)
logger.addHandler(console)
logger.setLevel(logging.DEBUG)
_loggers_[logger_name]=loggerreturnloggerdefhandle_log_record(address, record):'''@summary: handle log record
@param address: address[ip] of the record generated from
@param record: log record'''
#construct logger name
process_name =record.processName
process_id=record.process#print "process_name = %s, process_id = %s"%(process_name, process_id)
logger_name = "%s_%s" %(process_name, process_id)
logger=get_logger(address, logger_name)
formatter=logging.Formatter(
fmt="%(asctime)s %(name)-12s %(levelname)-8s %(message)s")
record_str=formatter.format(record)#print record_str
logger.info(record_str)#print "write"
#print address, record
#print record.filename
defhandle(socket, address):#get client ip
try:whileTrue:
chunk= socket.recv(4)if len(chunk) < 4:breakslen= struct.unpack(">L", chunk)[0]
chunk=socket.recv(slen)while len(chunk)
chunk+= socket.recv(slen -len(chunk))
obj=pickle.loads(chunk)
record=logging.makeLogRecord(obj)#handle_log_record(address[0], record)exceptException, e:pass
finally:
socket.close()#chunk = socket.recv(1024)
#print "handle invoked"
#socket.close()
if __name__ == '__main__':
port= 8888server= StreamServer(('0.0.0.0', port), handle)print ('Starting logging service on port %s'%port)
server.serve_forever()