python学习之路python自学

Django日志处理

2018-06-20  本文已影响2人  仲冬初七

日志处理

日志级别

选择低级别会默认包含自身级别以上的信息,但不会向下包含,即,选择了ERROR级别那么INFO, DEBUG等错误信息则会被忽略

过滤器

如: 可以指定一个只允许处理ERROR级别发送的特定消息的过滤器,也可以指定过滤掉一些不必要的操作,像记录DEBUG日志

格式化

verbose对日志进行详细的记录

'formatters': {
        # 详细的记录
        """
        levelname: 警告级别
        asctime: 发生时间
        module : 发生模块
        process : 进程信息
        thread : 线程信息
        message : 警告信息
        """
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        }

simple 简单的记录, 只输出警告级别和日志消息,也可以多指定

开启日志记录
import logging

logger = logging.getLogger(__name__)

def my_view(request, arg1, arg):
    ...
    if bad_mojo:
        # 记录到日志信息
        logger.error('这里出错了')

手动调用日志处理记录
实例,在配置文件中配置日志操作
LOGGING = {
    # 设置版本
    'version': 1,
    # 是否允许其他日志功能,Flase表示不禁用,禁用导致其他记录日志的功能将被阻止
    'disable_existing_loggers': False,
    # 格式化,日志输出格式
    'formatters': {
        # 详细
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d  %(thread)d %(message)s'
        },
        # 简单,可以自己添加或减少,看需求
        'simple': {
            'format': '%(levelname)s %(module)s  %(message)s'
        },
    },
    # 过滤器,过滤掉debug级别的错误,原因:debuf会输出在控制台,没必要记录
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    # 日志的处理方式
    'handlers': {
     # 将级别为DEBUG的错误以简单的形式输出在控制台
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        # 将INFO级别及以上的错误储存在文件中
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            # 日志文件的位置
            'filename':
            os.path.join(os.path.dirname(BASE_DIR), "logs/meiduo.log"),  
            # 单个文件大小 300M
            'maxBytes': 300 * 1024 * 1024,
            # 最多储存文件个数,超过十个则重头开始覆盖第一个文件
            'backupCount': 10,
            'formatter': 'verbose'
        },
    },
    # 日志器, 在程序中记录日志时操作对象的配置
    'loggers': {
        'django': {  #定义了一个名为django的日志器
            'handlers': ['console', 'file'],
            #设置是否运行日志向上一级日志功能传递
            'propagate': True,
        },
    }
}

以‘dictConfig version 1’格式解析配置。 目前为止,这是dictConfig 格式唯一的版本。

自定义异常处理器
# 创建日志器对象
logger = logging.getLogger('django')

def exception_handler(exc, context):
    """
    自定义异常处理
    :param exc: 异常
    :param context: 抛出异常的上下文
    :return: Response响应对象
    """
    # 调用drf框架原生的异常处理方法
    response = drf_exception_handler(exc, context)
    
    if response is None:
        view = context['view']
        if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
            # 数据库异常
            logger.error('[%s] %s' % (view, exc))
            response = Response({'message': '<错误信息>'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
    return response

-----------------
# 在配置文件中修改异常处理
REST_FRAMEWORK = {
    # 修改rest_framework框架中的异常处理机制
    'EXCEPTION_HANDLER': 'meiduo_mall.utils.exceptions.exception_handler',
}
上一篇 下一篇

猜你喜欢

热点阅读