如何给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元的《爱情困惑者必学的七堂课》;
100个搞定正妹完整聊天记录列表详情点这里
【完整版】时长7小时,原价699元《中国各阶层男性脱单上娶指南》;
  • 在chatgpt该怎么组织prompt
  • 大模型LLM相关面试题整理(持续更新...),大模型(LLMs)算法工程师相关的面试题和参考答案

    大家好,从 2019 年的谷歌 T5 到 OpenAI GPT 系列,参数量爆炸的大模型不断涌现。可以说,LLMs 的研究在学界和业界都得到了很大的推进,尤其去年 11 月底对话大模型 ChatGPT 的出现更是引起了社会各界的广泛关注。 近些年,在大规模语料库上预训练 Transformer 模型产生了预训练语言模型(PLMs),并在解决各类 NLP 任务上展现出了强大的能力。 有趣的是,当参数规模超过一定水平时,这个更大的语言模型实现了显著的性能提升,并展现出小模型中不存在的能力,比如上下文学习。为了区别于 PLM,这类模型被称为大型语言模型(LLMs)。 为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题,喜欢记得收藏、关注。 由于大模型面试题不断更新中,想持续关注的,可以加入我们技术群。 技术交流群 建了技术答疑、交流群!想要进交流群、资料的同学,可以直接加微信号:aisen5721。加的时候备注一下:姓名-学校-专业,即可。然后就可以拉你进群了。 前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

  • 大模型LLM相关面试题整理(持续更新...),大模型(LLMs)算法工程师相关的面试题和参考答案

    大家好,从 2019 年的谷歌 T5 到 OpenAI GPT 系列,参数量爆炸的大模型不断涌现。可以说,LLMs 的研究在学界和业界都得到了很大的推进,尤其去年 11 月底对话大模型 ChatGPT 的出现更是引起了社会各界的广泛关注。 近些年,在大规模语料库上预训练 Transformer 模型产生了预训练语言模型(PLMs),并在解决各类 NLP 任务上展现出了强大的能力。 有趣的是,当参数规模超过一定水平时,这个更大的语言模型实现了显著的性能提升,并展现出小模型中不存在的能力,比如上下文学习。为了区别于 PLM,这类模型被称为大型语言模型(LLMs)。 为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题,喜欢记得收藏、关注。 由于大模型面试题不断更新中,想持续关注的,可以加入我们技术群。 技术交流群 建了技术答疑、交流群!想要进交流群、资料的同学,可以直接加微信号:aisen5721。加的时候备注一下:姓名-学校-专业,即可。然后就可以拉你进群了。 前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

  • 关于算法学习的一些经验之谈