操操操

如何给django restframework配置日志记录

2019-11-23
2分钟阅读时长

我首先按照官方的文档来配置,发现并没有生效,本来想logger.info()应该顺理成章就打印出日志到文件里了,但是发现没有生效。

最终追究产生原因,发现是对于MIDDLEWAREMIDDLEWARE_CLASSES理解有误,导致自己针对于前端vue项目使用这些接口,一直捕获不到日志,最终调整了中间件位置至MIDDLEWARE中,最终成功捕获日志。 <!–more–> 本文分为两部分,第一部分,讲怎么启用日志及开启写入文件方便追踪。第二部分,讲如何来实现中间件,让djangorestful接口package:django restframework的所有请求都可以被记录下来。

第一部分:如何开启日志支持

django项目的settings.py中先开启日志记录的功能。 注意:下面日志的目录,日志文件要提前创建好,否则可能导致项目启动不起来。

# LOGGING 设置信息
LOG_DIR = BASE_DIR + "/manage_log"

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
         'standard': {
            'format': '%(asctime)s FuncName:%(funcName)s LINE:%(lineno)d [%(levelname)s]- %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(funcName)s %(message)s'
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'root': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },
    'handlers': {
        'sql': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, "sql_info.log"),
            'formatter': 'simple'
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'standard'
        },
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'info.log'),
            'maxBytes': 1024*1024*50,   # 50 MB
            'backupCount': 2,
            'formatter': 'standard',
        },
        'default_debug': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'debug.log'),
            'maxBytes': 1024*1024*50,  # 50 MB
            'backupCount': 2,
            'formatter': 'standard',
        },
        'request_handler': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'common.log'),
            'maxBytes': 1024*1024*50,  # 50 MB
            'backupCount': 2,
            'formatter': 'standard',
        },
        'restful_api': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'api.log'),
            'maxBytes': 1024*1024*50,  # 50 MB
            'backupCount': 2,
            'formatter': 'verbose',
        },

    },
    'loggers': {
        'django': {
            'handlers': ['console', 'default_debug'],
            'level': 'INFO',
            'propagate': False
        },
        'django.request': {
            'handlers': ['request_handler'],
            'level': 'INFO',
            'propagate': False
        },
        'common': {
            'handlers': ['default', 'console'],
            'level': 'INFO',
            'propagate': True
        },
        'api': {
            'handlers': ['restful_api'],
            'level': 'INFO',
            'propagate': True
        },
        'django.db.backends': {
            'handlers': ['console','sql'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

第二部分:如何创建一个可以记录django restframework请求相关的全链录日志

  1. 创建项目目录下供相应应用使用的中间件

python manage.py startproject xx这个命令,如果你从头到尾创建过相应的项目,你肯定不陌生,注意这里创建的是项目,不是应用,注意与python manage.py startapp xx这个创建应用的命令区分开。可以理解成一个项目下面可以创建很多个应用,在这种状况下,由于我们准备创建这个中间件,只给我供C端用户使用的客户技术栈项目vue来使用,所以,我针对这个应用创建中间件就可以了。

  • 1.1 在某应用目录下新建middleware.py文件,文件内容如下。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
import json


class ApiLoggingMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response
        self.apiLogger = logging.getLogger('api')

    def __call__(self, request):
        try:
            body = json.loads(request.body)
        except Exception:
            body = dict()
        body.update(dict(request.POST))
        response = self.get_response(request)
        self.apiLogger.info("{} {} {} {} {} {} {}".format(
            request.user, request.method, request.path, body,
            response.status_code, response.reason_phrase, str(response.content)))
        return response
  1. 在项目配置文件settings.py(上面已经提到过了)做如下的配置
  • 2.1 配置文件的MIDDLEWARE部分引入创建好的中间件

添加的配置选项

这样就可以正常查看日志了。

所生成的日志记录文件

Avatar

Aisen

Be water,my friend.
扫码关注公众号,可领取以下赠品:
《夯实基础的go语言体系建设》645页涵盖golang各大厂全部面试题,针对云原生领域更是面面俱到;
扫码加微信,可领取以下赠品:
【完整版】本人所著,原价1299元的《爱情困惑者必学的七堂课》; 50个搞定正妹完整聊天记录列表详情点这里
【完整版】时长7小时,原价699元《中国各阶层男性脱单上娶指南》;