项目结构如下

代码如下
主文件logutils.py(附注释)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import logging
import time
import logging.handlers
reload(sys)
sys.setdefaultencoding('utf8')
FOMMATER = '[%(asctime)s](%(levelname)s) {pid:%(process)d, tid:%(thread)d, %(filename)s}, %(module)s.%(funcName)s %(lineno)d: %(message)s\r'
LOG_HOME = '..' + os.sep + 'log' + os.sep
def getLogger(logfile, pscr = False):
'''
:logfile 日志输出文件,只输入文件名到默认路径,或直接输入系统的其他绝对路径
:pscr 是否将日志输出到控制台
'''
global LOG_HOME
# 输入指定的其他目录存放日志时,若绝对路径不存在,抛出IOError异常
if logfile.find(os.sep) != -1:
onlydir = os.path.dirname(logfile)
if not os.path.isdir(onlydir):
raise IOError("The %s path doesn't exist!" % onlydir)
else:
logfile = os.path.join(LOG_HOME, logfile)
# 判断扩展名是否为log,若不存在需要添加log后缀
ext = os.path.splitext(logfile)[1]
if ext != '.log' :
logpath = ('%s.log' % logfile)
else:
logpath = logfile
ml = ModuleLogger('')
ml.init(logpath, pscr)
return ml
class ModuleLogger(logging.Logger):
def init(self, logpath, pscr):
global FOMMATER
self.logpath = logpath
self.pscr = pscr
# self.debug_ctl = debug_ctl;
if(self.pscr):
# create console handler with a higher log level
ch = logging.StreamHandler(sys.stdout)
# ch.setLevel(self.level)
# create formatter and add it to the handlers
self.format = logging.Formatter(FOMMATER)
if(self.pscr):
ch.setFormatter(self.format)
# add the handlers to the logger
if(self.pscr):
self.addHandler(ch)
#生成RotatingFileHandler,设置文件大小为10M,编码为utf-8,最大文件个数为30个,如果日志文件超过3,则会覆盖最早的日志
hdlr_Rotating = logging.handlers.RotatingFileHandler(logpath, mode = 'a', maxBytes = 1024*1024*100, backupCount = 10, encoding = 'utf-8')
hdlr_Rotating.setFormatter(self.format)
# hdlr_Rotating.setLevel(level)
self.addHandler(hdlr_Rotating)
def config(self,logpath, pscr):
global FOMMATER
self.logpath = logpath
self.pscr = pscr
# self.debug_ctl = debug_ctl;
if self.handlers:
for handler in self.handlers:
self.removeHandler(handler)
if(self.pscr):
# create console handler with a higher log level
ch = logging.StreamHandler(sys.stdout)
# ch.setLevel(self.level)
# create formatter and add it to the handlers
self.format = logging.Formatter(FOMMATER)
if(self.pscr):
ch.setFormatter(self.format)
# add the handlers to the logger
if(self.pscr):
self.addHandler(ch)
#生成RotatingFileHandler,设置文件大小为10M,编码为utf-8,最大文件个数为30个,如果日志文件超过30,则会覆盖最早的日志
hdlr_Rotating = logging.handlers.RotatingFileHandler(logpath, mode = 'a', maxBytes = 1024*1024*10, backupCount = 30, encoding = 'utf-8')
hdlr_Rotating.setFormatter(self.format)
# hdlr_Rotating.setLevel(level)
self.addHandler(hdlr_Rotating)
if __name__ == '__main__':
''' Usage: from logutils import getLogger '''
# 日志文件名,控制台可显
logger = getLogger("logmodule", False)
try:
logger.error('ioerror')
logger.info('output')
logger.debug('enter proc')
except Exception, e:
print str(e)
配置context.py(附注释)
#!coding=utf-8
import os
from utilstools.logutils import getLogger
cur_path = os.path.normpath(os.path.dirname(__file__))
# FAILED_PATH ="D:/log/failed.log"
FAILED_PATH = os.path.dirname(cur_path) + os.sep + "logs/failed.log"
# 日志文件名,控制台可显
logger = getLogger(FAILED_PATH,True)
if __name__ == '__main__':
try:
logger.error('ioerror')
logger.info('output')
logger.debug('enter proc')
except Exception, e:
print str(e)
效果如下

