利用Django中间件做日志,异常捕获,反应超时

      为了记录每次API的访问时传入的参数, 以及后端返回的数据, 使用中间件, 将所有的数据写到日志文件中.

①在某个应用下创建一个middleware.py的文件, 并在配置文件中注册该中间件

import json
import time
from django.http import JsonResponse
from django.utils.deprecation import MiddlewareMixin
import logging


logger = logging.getLogger('api_track')
logger_time = logging.getLogger('api_timeout')
logger_error = logging.getLogger("api_error")


class DataReCordMiddleware(MiddlewareMixin):

    def __init__(self, *args):
        super(DataReCordMiddleware, self).__init__(*args)
        self.start_time = None          # 访问时间
        self.end_time = None

    def process_request(self, request):
        self.start_time = time.time()   

    def process_response(self, request, response):
        time_obj = TimeUtils()
        now_time = time_obj.get_now_time()

        api = request.get_full_path()       # 1-获得请求的API
        request_method = request.method     # 2-获得请求的方法

        input_params = []                   # 3-给请求参数一个默认值(空列表)
        user_id = "test"                    # 4-给访问用户一个默认值

        if request_method == "GET":
            input_params = request.GET.dict()
            user_id = request.GET.get('user_id')
        elif request_method == "POST":
            input_params = request.POST.dict()
            user_id = request.POST.get('user_id')

        """
        elif request_method == "PUT":
            input_params = request.body.decode()
         '''
        """

        ret_dict = response.content.decode()      # 5-获得api返回的数据
        try:
            ret_dict = json.loads(ret_dict)       # 6-更改格式 这里之所以要try, 是因为返回404等界面时,不需要json.loads()
        except:
            pass

        logger.info("\n %s user_id = %s  api=%s  method=%s"     # 7-日志记录请求参数和返回结果
                    "\n %s input=%s "
                    "\n %s output=%s" % (now_time, user_id, api,  request_method, now_time, input_params, now_time, ret_dict))
        
        self.end_time = time.time()     # API响应时间
        waste_time = self.end_time - self.start_time    # 访问API消耗时间

        if waste_time >= 0.3:           # 这里可以自定义一个时间,作为耗时的标准, 超时的记录在一个日志文件中, 后期再对API进行优化
            logger_time.info('%s, 耗时:%s' % (api, waste_time))
        return response

    def process_exception(self, request, exception):
        api = request.get_full_path()
        ret = "服务器繁忙, 请稍后再试"
        logger_error.info("API: %s\n 异常信息:%s " % (api, exception))  # 还可以捕获异常, 写到错误日志里边, 测试阶段直接把exception返回就可以

        return JsonResponse({'code': -1, 'msg': '%s' % ret})

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值