django日志配置 异常处理
django日志配置
1.django日志输出配置
日志输出方式有2种,一种是控制台输出,另一种是输出到文件
logging配置有4个部分组成
Loggers --> 日志记录对象,用来触发日志记录功能,日志级别=> debug --> info --> warning --> error --> critical
Handlers --> 指定使用logging日志模块中的那一项功能,指定使用哪个控制类,控制台打印或存在日志文件中
过滤器 --> 记录哪些错误信息,哪些错误信息不记录,过滤输出的日志
Formatters --> 配置日志生成格式,如日志生成时间,错误等级,报错位置等
具体含义请看官方文档:https://docs.djangoproject.com/zh-hans/2.0/topics/logging/
2. 在dev.py中配置日志
# 日志配置 LOGGING = { 'version': 1, # 日志模块版本 'disable_existing_loggers': False, #是否关闭现在已经有的日志功能 'formatters': { # 日志的处理格式 'verbose': {# 键值名,可以修改 |行号 |错误记录信息 'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s' }, |日志等级 |日志发生时间 |发生错误的文件 'simple': { 'format': '%(levelname)s %(module)s %(lineno)d %(message)s' }, }, 'filters': { 'require_debug_true': {# debug等于true的模式下记录哪些日志 '()': 'django.utils.log.RequireDebugTrue', }, }, 'handlers': {# 指定记录日志的位置,在控制台打印还是记录在日志文件中 'console': {# 控制台打印 'level': 'DEBUG', #大于等于debug的日志都会被记录,debug日志等级最小,所以表示所有日志都打印. 'filters': ['require_debug_true'], # 调用上面filters 'class': 'logging.StreamHandler', # 往控制台打印日志 'formatter': 'simple' # 调用上面的simple }, 'file': { # 往文件中输出 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 核心代码类 # 日志位置,日志文件名,日志保存目录必须手动创建 'filename': os.path.join(os.path.dirname(BASE_DIR), "logs/renran.log"), # 单个日志文件的最大值,这里我们设置300M 'maxBytes': 300 * 1024 * 1024, # 备份日志文件的数量,设置最大日志数量为10 'backupCount': 10, # 日志格式:详细格式 'formatter': 'verbose' }, }, # 日志对象 'loggers': { 'django': { # 固定,将来django内部也会有异常的处理,只会调用django下标的日志对象 'handlers': ['console', 'file'], 'propagate': True, # 是否让日志信息继续冒泡给其他的日志处理系统 }, } }
3. 再次运行项目即可看到有日志输出.
3.异常处理 utils/exceptions.py
drf默认提供的异常处理函数exception_handler 只能捕获一些基本的错误信息,捕获不了apiviews报出来的错误,如果需要捕获apiviews的错误,还需要自定义一个捕获函数.
from rest_framework.views import exception_handler #exception_handler 只能捕获基本错误 from django.db import DatabaseError from rest_framework.response import Response from rest_framework import status import logging logger = logging.getLogger('django') def custom_exception_handler(exc, context): """ 自定义异常处理 :param exc: 异常类 :param context: 抛出异常的上下文 :return: Response响应对象 """ # 调用drf框架原生的异常处理方法 response = exception_handler(exc, context) # exc错误对象 context 记录日志发生的位置 if response is None: view = context['view'] if isinstance(exc, DatabaseError): # 数据库异常 logger.error('[%s] %s' % (view, exc)) response = Response({'message': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE) return response
如图:
settings/dev.py配置文件中添加
REST_FRAMEWORK = { # 异常处理 'EXCEPTION_HANDLER': 'renranapi.utils.exceptions.custom_exception_handler', }