django 捕获异常和日志系统过程详解
这一块的内容很少,异常使用tryexcept即可,日志只需要几行配置.
使用装饰器捕获方法内的所有异常
我使用装饰器来整个包裹一个方法,捕获方法中的所有异常信息.并将其转为json返回客户端.
importfunctools defcatch_exception(func,code=500,*args,**kwargs): ''' :paramfunc: :return: ''' @functools.wraps(func,*args,**kwargs) defnefen(request,*args,**kwargs): try: back=func(request,*args,**kwargs) returnback exceptExceptionase: #string="捕获到异常" #x=type(e) # #ifx==ValueError: #string="数值转换异常:"+str(e) returnJsonError(error_string=str(e),code=code) returnnefen
JsonError是之前编写的json工具.
装饰器的使用方法如下.
classReturnJson(APIView): coreapi_fields=( DocParam("token"), ) @catch_exception defget(self,request,*args,**kwargs): params=get_parameter_dic(request) returnJsonResponse(data=params) @catch_exception defpost(self,request,*args,**kwargs): params=get_parameter_dic(request) returnJsonResponse(data=params) @catch_exception defput(self,request,*args,**kwargs): params=get_parameter_dic(request) returnJsonResponse(data=params)
日志配置
#首先创建日志存储路径. importlogging importdjango.utils.log importlogging.handlers log_path=os.path.join(BASE_DIR,"logs") ifnotos.path.exists(log_path): os.makedirs("logs") #DJANGO_LOG_LEVEL=DEBUG LOGGING={ 'version':1, 'disable_existing_loggers':False, 'formatters':{ 'verbose':{ 'format':'%(levelname)s%(asctime)s%(module)s%(process)d%(thread)d%(message)s' }, 'simple':{ 'format':'%(levelname)s%(message)s' }, 'standard':{ 'format':'%(asctime)s[%(threadName)s:%(thread)d][%(name)s:%(lineno)d][%(levelname)s]-%(message)s' }, }, 'handlers':{ 'default':{ 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', 'filename':os.path.join(BASE_DIR,'logs','all.log'),#或者直接写路径:'c:\logs\all.log', 'maxBytes':1024*1024*5,#5MB 'backupCount':5, 'formatter':'standard', }, 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter':'standard', }, 'file':{ 'level':'INFO', 'class':'logging.handlers.RotatingFileHandler', 'filename':os.path.join(BASE_DIR,'logs','debug.log'),#或者直接写路径:'c:\logs\all.log', 'maxBytes':1024*1024*5,#5MB 'backupCount':5, 'formatter':'standard', }, }, #DEBUG(测试环境)CRITICAL(项目崩溃)ERROR(抛出异常未被捕获)WARNING(例如403)INFO(系统表现相关) 'loggers':{ 'print':{ 'handlers':["file"], 'level':'INFO', 'propagate':False }, 'ifacerecognition':{ 'handlers':['default'], 'level':'ERROR', }, #'django':{ #'handlers':['default'], #'level':os.getenv('DJANGO_LOG_LEVEL','INFO'), #}, 'django.request':{ 'handlers':['default'], 'level':'ERROR', }, }, }
日志配置由三部分组成
1.日志格式formatters
2.日志处理方法,例如保存到xxx.log文件或者别的什么,甚至可以自动发送电子邮件.
3.日志器,也就是正式的应用,你可以获取一个log,手动添加log内容.
一个向log文件写入内容的例子
importlogging classReturnJson(APIView): coreapi_fields=( DocParam("token"), ) @catch_exception defget(self,request,*args,**kwargs): params=get_parameter_dic(request) log=logging.getLogger("print") log.info("asdf") log.error("asdffff") returnJsonResponse(data=params)
至此一个django项目所需要的组成部分基本齐全了.剩下的工作只是业务逻辑的编写.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。