美文网首页
django-捕获异常和日志系统

django-捕获异常和日志系统

作者: 行如风 | 来源:发表于2017-10-20 17:23 被阅读1027次

这一块的内容很少, 异常使用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项目所需要的组成部分基本齐全了. 剩下的工作只是业务逻辑的编写.

下一篇开始介绍如何将项目部署到远程服务器上(ubuntu).

相关文章

  • django-捕获异常和日志系统

    这一块的内容很少, 异常使用try except即可, 日志只需要几行配置. 使用装饰器捕获方法内的所有异常 我使...

  • logging日志使用

    日志的等级 捕获异常信息到日志。这里主要需要进行捕获异常才能记录下完整的异常信息 日志的输出格式 对于日志的输出格...

  • 异常捕获和分析

    主要内容 闪退捕获 日志分析 闪退捕获 内核级异常:Mach异常->Unit信号(Mach层捕获到异常通过发送信号...

  • [转]Web应用上线之前程序员应该了解的技术细节

    开发 记录UI错误日志JavaScript 允许捕获异常。这些异常需要通过Ajax请求提交到日志服务,否则很难截获...

  • SprnigMVC的统一异常处理

    我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息...

  • SpringMVC中的统一异常处理

    系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主...

  • springboot 异常捕获和处理

    springboot 异常捕获和处理 异常捕获处理

  • SpringMvc异常处理机制

    系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主...

  • python异常处理、模块、私有化

    异常处理 一、系统异常 1.捕捉异常 2.捕获多个异常 3.异常描述信息 4.捕获所有异常 5.try…final...

  • 异常捕获

    异常捕获 有两种 IOS系统的异常NSSetUncaughtExceptionHandler(&exception...

网友评论

      本文标题:django-捕获异常和日志系统

      本文链接:https://www.haomeiwen.com/subject/vubvuxtx.html