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 相关文章推荐
python2.7删除文件夹和删除文件代码实例
Dec 18 Python
python正则表达式判断字符串是否是全部小写示例
Dec 25 Python
Python实现统计单词出现的个数
May 28 Python
Python3安装Pymongo详细步骤
May 26 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
对Python信号处理模块signal详解
Jan 09 Python
简单了解Python matplotlib线的属性
Jun 29 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
python 实现视频 图像帧提取
Dec 10 Python
python模拟斗地主发牌
Apr 22 Python
Python实现自动签到脚本的示例代码
Aug 19 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
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
PHP 实现重载
2021/03/09 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
js单例模式详解实例
2013/11/21 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
js实现微信聊天界面
2020/08/09 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
python 模拟登录B站的示例代码
2020/12/15 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
主管竞聘书范文
2014/03/31 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
手术室护士个人总结
2015/02/13 职场文书
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB