django 捕获异常和日志系统过程详解
作者:行如风 发布时间:2022-04-26 22:12:43
标签:django,捕获,异常,日志,系统
这一块的内容很少, 异常使用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项目所需要的组成部分基本齐全了. 剩下的工作只是业务逻辑的编写.
来源:https://www.jianshu.com/p/04287164a274


猜你喜欢
- 环境:pyecharts库,echarts-countries-pypkg,echarts-china-provinces-pypkg,ec
- 对于爬虫中部分网站设置了请求次数过多后会封杀ip,现在模拟浏览器进行爬虫,也就是说让服务器认识到访问他的是真正的浏览器而不是机器操作简单的直
- 导语哈喽哈喽!大家好!我是木木子,又到了每日游戏更新环节!8月30日,对暑假还意犹未尽的孩子们收到了一份“开学大礼”:通知要求,严格限制向未
- 以下代码是基于python3.5.0编写的import pandasfood_info = pandas.read_csv("fo
- 一、准备工作开始之前,先参考上一篇: struts2.3.24 + spring4.1.6 + hibernate4.3.11 +
- 首先看看Vue文档里关于实例生命周期的解释图那么下面我们来进行测试一下<section id="app-8">
- 队列和优先队列(Priority Queue)队列是一种可以完成插入和删除的数据结构。普通队列是先进先出(FIFO), 即先插入的先被删除。
- Python官方文档给出的解释是id(object)Return the “identity” of an object. This is
- 一、日志输出到文件使用模块:logging可以生成自定义等级日志,可以输出日志到指定路径日志等级:debug(调试日志) < info
- PDO::getAvailableDriversPDO::getAvailableDrivers — 返回一个可用驱动的数组(PHP 5 &
- 一、环境pip install opencv-pythonpython3.9pycharm2020人狠话不多,直接上代码,注释在代码里面,不
- MYSQL对大小写敏感见字如面,见标题知内容。你有遇到过因为MYSQL对大小写敏感而被坑的体验吗?之前看过阿里巴巴Java开发手册,在MyS
- 在写sql的时候,由于有部分语句别名不能调用,百度了一下原因,原来是由于别名机制不同引起的。为了避免下一次再犯同样的错误,今天把网上找到资料
- 目录1.简介2.如何解决3.虚线框类代码4.测试UI界面如下图所示5.拖动时的效果图如下所示1.简介看到很多才学QT的人都会问为啥无边框拖动
- 用下列代码即可:<%On error resume nextSet session=Creat
- 1.学习目标递归函数是直接调用自己或通过一系列语句间接调用自己的函数。递归在程序设计有着举足轻重的作用,在很多情况下,借助递归可以优雅的解决
- 1.算法:(设查找的数组期间为array[low, high])(1)确定该期间的中间位置K(2)将查找的值T与array[k]比较。若相等
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 导语为什么有这么一个简单的游戏?这个游戏如此受欢迎?仅仅是因为它在游戏行业异常匮乏的年代出现,从而成为了一代人的记忆吗?恐怕并不是。玩过俄罗
- 字体反爬,也是一种常见的反爬技术,这些网站采用了自定义的字体文件,在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成其他字