Django 异常捕获与日志系统配置实战

Jasper
Jasper
发布时间:2026-10-13 | 6人浏览过
原创

本文介绍在 Django 项目中通过自定义装饰器统一捕获视图层异常,并将错误信息以 JSON 格式返回客户端的方法。同时详细解析 Django 日志系统的三部分配置:格式定义、处理器设置及日志器调用,帮助开发者建立完善的错误监控与记录机制。

Django 异常捕获与日志配置概述

异常处理与日志记录是 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)

Django 日志系统配置详解

日志系统的基础配置


# 首先创建日志存储路径.
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',
    },
  },
}

完整的日志配置体系主要由三个核心部分构成。

第一部分是日志格式(formatters),用于定义日志输出的样式。

第二部分是日志处理器(handlers),例如将日志写入指定 .log 文件,或配置其他输出渠道,甚至支持自动发送电子邮件告警。

第三部分是日志器(loggers),即应用程序中实际获取 logger 实例并手动添加日志内容的模块。

以下是一个向日志文件写入具体内容的示例代码。


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 项目已具备异常捕获与日志记录的基础组件,后续工作主要集中于具体业务逻辑的开发。

以上内容涵盖了 Django 异常处理与日志配置的核心要点,希望对读者有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表