三、封装django logging模块

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

一、默认日志配置在django 1.4中默认有一个简单的日志配置,如下

#A sample logging configuration. The only tangible logging#performed by this configuration is to send an email to#the site admins on every HTTP 500 error when DEBUG=False.#See http://docs.djangoPRoject.com/en/dev/topics/logging for#more details on how to customize your logging configuration.LOGGING ={'version': 1,'disable_existing_loggers': False,'filters': {'require_debug_false': {'()':'django.utils.log.RequireDebugFalse'}

},'handlers': {'mail_admins': {'level':'ERROR','filters': ['require_debug_false'],'class':'django.utils.log.AdminEmailHandler'}

},'loggers': {'django.request': {'handlers': ['mail_admins'],'level':'ERROR','propagate': True,

},

}

}

可以看出默认的‘disable_existing_loggers’值为False。

默认没有定义formatters。

字典中,组结束没有加逗号,所以在增加时需要写上。

二、简单例子1、配置settings.py中LOGGING增加下面绿色部分内容配置。

LOGGING ={'version': 1,'disable_existing_loggers': False,'formatters': {

'standard': {

'format': '%(levelname)s %(asctime)s %(message)s'

},

},'filters': {'require_debug_false': {'()':'django.utils.log.RequireDebugFalse'},

},'handlers': {'mail_admins': {'level':'ERROR','filters': ['require_debug_false'],'class':'django.utils.log.AdminEmailHandler'},'test1_handler':{

'level':'DEBUG',

'class':'logging.handlers.RotatingFileHandler',

'filename':'/yl/smartcloud/smartcloud/lxytest.log',

'formatter':'standard',

},},'loggers': {'django.request': {'handlers': ['mail_admins'],'level':'ERROR','propagate': True,

},'test1':{

'handlers':['test1_handler'],

'level':'INFO',

'propagate':False

},}

}

配置中level,filename之类的可自定义,需要几个文件就配置几个handler和logger。

2、使用导入logging如果在用到log的view.py中,想使用test1这个日志,就写:log=logging.getLogger('test1')log.error() 在日志内容中传递变量,log.error("Get html error, %s" % (e))#!/usr/bin/python#-*- coding: UTF-8 -*-importloggingfromdjango.httpimportHttpResponseRedirect,HttpResponse, Http404fromdjango.shortcutsimportrender_to_response, get_object_or_404fromdjango.templateimportRequestContext

log=logging.getLogger('test1')defgetHtml(request,arg):try:

url=request.path

url=url[1:]returnrender_to_response(url,RequestContext(request))exceptException,e:#log.error("Get html error, %s" % (e))log.error("日志内容")raiseHttp404

使用变量后的log如下:

三、封装django logging模块django自带的logging模块也是可以用的,如果要求更高,希望加一些自定义的颜色,格式等,可进行下面操作。

1、将log封装成一个单独的app[root@yl-web-test log]#django-admin.py startapp log[root@yl-web-test log]#ls__init__.py models.py tests.py views.py

2、创建一个log.py,内容如下#!/usr/bin/pythonimportosimportsysimporttime

sys.path.append("..")importconfimportloggingimportlogging.handlerstry:importcurses

curses.setupterm()except:

curses=None

default_logfile= getattr(conf,'SMARTCLOUD_LOGFILE')classSingleton(type):"""Singleton Metaclass"""def__init__(cls,name,bases,dic):

super(Singleton,cls).__init__(name,bases,dic)

cls.instance=Nonedef__call__(cls, *args, **kwargs):ifcls.instanceisNone:

cls.instance= super(Singleton,cls).__call__(*args,**kwargs)returncls.instanceclassMessageFormatter(logging.Formatter):def__init__(self,color,*args,**kwargs):

logging.Formatter.__init__(self,*args,**kwargs)

self._color=colorifcolorandcurses:

fg_color= unicode(curses.tigetstr("setaf")or\

curses.tigetstr("setf")or"","ascii")

self._colors={

logging.DEBUG: unicode(curses.tparm(fg_color,2),"ascii"),

logging.INFO: unicode(curses.tparm(fg_color,6),"ascii"),

logging.WARNING: unicode(curses.tparm(fg_color,3),"ascii"),

logging.ERROR: unicode(curses.tparm(fg_color,5),"ascii"),

logging.FATAL: unicode(curses.tparm(fg_color,1),"ascii"),

}

self._normal= unicode(curses.tigetstr("sgr0"),"ascii")defformat(self,record):try:

record.message=record.getMessage()exceptException, e:

record.message="Bad message (%r): %r"% (e, record.__dict__)

record.asctime= time.strftime("%Y/%m/%d %H:%M:%S",\

self.converter(record.created))

prefix='[%(levelname)-8s %(asctime)s]'% record.__dict__ifself._colorandcurses:

prefix= (self._colors.get(record.levelno, self._normal) +\

prefix+self._normal)

formatted= prefix +record.messageifrecord.exc_info:ifnotrecord.exc_text:

record.exc_text=self.formatException(record.exc_info)ifrecord.exc_text:

formatted= formatted.rstrip() +"\n"+record.exc_textreturnformatted.replace("\n","\n")classMessageLog(object):__metaclass__=Singletondef__init__(self, logfile=default_logfile,):

self._LEVE= {1:logging.INFO, 2:logging.WARNING, 3:logging.ERROR,\4:logging.DEBUG, 5:logging.FATAL}

self.loger=logging.getLogger()

self._logfile=logfile

self.init()definit(self):ifnotos.path.exists(self._logfile):os.mknod(self._logfile)

handler=logging.handlers.RotatingFileHandler(self._logfile)

handler.setFormatter(MessageFormatter(color=True))

self._handler=handler

self.loger.addHandler(handler)defINFO(self,msg,leve=1):

self.loger.setLevel(self._LEVE[leve])

self.loger.info(msg)defWARNING(self, msg, leve=2):

self.loger.setLevel(self._LEVE[leve])

self.loger.warning(msg)defERROR(self, msg, leve=3):

self.loger.setLevel(self._LEVE[leve])

self.loger.error(msg)defDEBUG(self, msg, leve=4):

self.loger.setLevel(self._LEVE[leve])

self.loger.debug(msg)defFATAL(self, msg, leve=5):

self.loger.setLevel(self._LEVE[leve])

self.loger.fatal(msg)

conf.py是一个配置文件,在log app同目录,里面配置了log文件目录。

importos

SMARTCLOUD_LOGFILE='/yl/smartcloud/log/smartcloud.log'

3、测试在log.py结果加上一段测试代码如下:

if__name__=="__main__":

LOG=MessageLog()

str1="aaaaaaaa"str2="bbbbbbbbbb"LOG.INFO("#%s###################################""@@@@%s@@@@@@@@@@@"%(str1,str2))

LOG.WARNING("####################################")

LOG.ERROR("####################################")

LOG.DEBUG("####################################")

LOG.FATAL("####################################")

测试结果如下:

4、在view中使用usage e.g:fromlogimportMessageLog

LOG= MessageLog('your log file by full path')orLOG =MessageLog()

default logfile nameis'/yl/smartcloud/log/smartcloud.log'LOG.INFO('some message')

LOG.WARNING('some message')

LOG.ERROR('some message')

LOG.DEBUG('some message')

LOG.FATAL('some message')

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/4702026.html有问题欢迎与我讨论,共同进步。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航