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',
}

 

 

 

posted @ 2021-03-29 17:48  urls  阅读(592)  评论(0编辑  收藏  举报