django 捕获异常和日志系统过程详解


Posted in Python onJuly 18, 2019

这一块的内容很少, 异常使用try except即可, 日志只需要几行配置.

使用装饰器捕获方法内的所有异常

我使用装饰器来整个包裹一个方法, 捕获方法中的所有异常信息.并将其转为json返回客户端.

import functools

def catch_exception(func, code=500, *args, **kwargs):
  '''
  :param func:
  :return:
  '''

  @functools.wraps(func, *args, **kwargs)
  def nefen(request, *args, **kwargs):
    try:
      back = func(request, *args, **kwargs)
      return back
    except Exception as e:
      # string = "捕获到异常"
      # x = type(e)
      #
      # if x == ValueError:
      #   string = "数值转换异常:" + str(e)
      return JsonError(error_string=str(e), code=code)

  return nefen

JsonError是之前编写的json工具.

装饰器的使用方法如下.

class ReturnJson(APIView):

  coreapi_fields=(
    DocParam("token"),
  )
  
  @catch_exception
  def get(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    return JsonResponse(data=params)
  
  @catch_exception
  def post(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    return JsonResponse(data=params)
  
  @catch_exception
  def put(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    return JsonResponse(data=params)

日志配置

# 首先创建日志存储路径.
import logging
import django.utils.log
import logging.handlers

log_path = os.path.join(BASE_DIR, "logs")

if not os.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, # 5 MB
      '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, # 5 MB
      '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文件写入内容的例子

import logging
class ReturnJson(APIView):

  coreapi_fields=(
    DocParam("token"),
  )

  @catch_exception
  def get(self, request, *args, **kwargs):
    params=get_parameter_dic(request)
    log=logging.getLogger("print")
    log.info("asdf")
    log.error("asdffff")
    return JsonResponse(data=params)

至此一个django项目所需要的组成部分基本齐全了. 剩下的工作只是业务逻辑的编写.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的对象拷贝示例 python引用传递
Jan 23 Python
python刷投票的脚本实现代码
Nov 08 Python
Python、Javascript中的闭包比较
Feb 04 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
Sep 08 Python
pycharm内无法import已安装的模块问题解决
Feb 12 Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
Python基于locals返回作用域字典
Oct 17 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
Django实现发送邮件功能
Jul 18 #Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 #Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 #Python
django页面跳转问题及注意事项
Jul 18 #Python
django框架模板语言使用方法详解
Jul 18 #Python
Django中间件基础用法详解
Jul 18 #Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 #Python
You might like
php5.2.0内存管理改进
2007/01/22 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
php 多个变量指向同一个引用($b = &$a)用法分析
2019/11/13 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
js获取url中"?"后面的字串方法
2014/05/15 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
搭建vue开发环境
2018/07/19 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
python回调函数的使用方法
2014/01/23 Python
python中的字典详细介绍
2014/09/18 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
python创建进程fork用法
2015/06/04 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
python 内置函数汇总详解
2019/09/16 Python
Python获取时间戳代码实例
2019/09/24 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
会计专业推荐信
2013/10/29 职场文书
艺术应用与设计个人的自我评价
2013/11/23 职场文书
自荐信写法介绍
2014/01/25 职场文书
一年级小学生评语
2014/04/22 职场文书
淘宝活动总结范文
2014/06/26 职场文书
写给老婆的保证书
2015/02/27 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
导游词之云南省玉龙雪山
2019/12/19 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS