一、默认日志配置在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有问题欢迎与我讨论,共同进步。