django日志默认打印request请求信息的方法示例

需求

请求view中手动打印日志时中插入request的如下信息(每个request请求都记录可以使用中间件进行解决,但这里仅仅是在需要的地方手动打印):

 #统一附加日志内容

ADD_LOG = r'''{"username": request.user, "path": request.path, "request_id": request.id, "login_id": request.login_id}'''

旧的解决办法

在每次需要打印日志时,通过 logging extra 进行额外的打印信息添加:每次手动添加同样的extra非常的不优雅。

新的解决方案

django 自带log系统官方文档

1、熟悉python的logging模块结构。

2、django中间件存储request信息。

class RequestLogMiddleware(MiddlewareMixin):
  """
  将request的信息记录在当前的请求线程上
  """
  def process_request(self, request):
    # 统一附加日志内容
    # ADD_LOG = r'''{"username": request.user, "path": request.path, "request_id": request.id, "login_id": request.login_id}'''
    local.path = request.path
    local.request_id = request.id
    local.login_id = request.login_id
    local.username = request.user.username

3、logging的filters模块添加request信息。

import logging

class RequestLogFilter(logging.Filter):
  """
  日志过滤器,将当前请求线程的request信息保存到日志的record上下文
  """
  def filter(self, record):
    record.request_id = getattr(local, 'request_id', "none")
    record.path = getattr(local, 'path', "none")
    record.login_id = getattr(local, 'login_id', "none")
    record.username = getattr(local, 'username', "none")
    record.appName = getattr(local, "appName", "none")
    return True

4、实现原理及代码

通过 local = threading.local()。

middleware-waiwen文件代码:

import threading
import logging
try:
  from django.utils.deprecation import MiddlewareMixin # Django 1.10.x
except ImportError:
  MiddlewareMixin = object # Django 1.4.x - Django 1.9.x

local = threading.local()
class RequestLogFilter(logging.Filter):
  """
  日志过滤器,将当前请求线程的request信息保存到日志的record上下文
  record带有formater需要的信息。
  """
  def filter(self, record):
    record.request_id = getattr(local, 'request_id', "none")
    record.path = getattr(local, 'path', "none")
    record.login_id = getattr(local, 'login_id', "none")
    record.username = getattr(local, 'username', "none")
    return True

class RequestLogMiddleware(MiddlewareMixin):
  """
  将request的信息记录在当前的请求线程上。
  """
  def process_request(self, request):
    # 统一附加日志内容
    # ADD_LOG = r'''{"username": request.user, "path": request.path, "request_id": request.id, "login_id": request.login_id}'''
    local.path = request.path
    local.request_id = request.id
    local.login_id = request.login_id
    local.username = request.user.username

settings 文件配置

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',

  'wcloud.middleware-waiwen.RequestLogMiddleware'
   #使用该中间件
   #将当前的request信息保存到当前线程供日志打印使用
]

LOGGING = {
    # 日志相关
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
      'standard': {
        'format': '{"date": "%(created)f", "level": "%(levelname)s", "funcName": "%(module)s.%(funcName)s:%(lineno)d", "msg": "%(message)s"}'}, # 日志格式
      'custom': {
       #该格式化中包含有过滤器record新增的字段
        'format': '{"date": "%(created)f", "level": "%(levelname)s", "funcName": "%(module)s.%(funcName)s:%(lineno)d", "request_id": "%(request_id)s","login_id": "%(login_id)s", "username": "%(username)s", "path": "%(path)s","msg": "%(message)s"}'
      },
    },
    'filters': {
      #注册该过滤器
      'request_info': {'()': 'wcloud.middleware-waiwen.RequestLogFilter'}
    },
    'handlers': {
      'log': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'custom',
       #在该过handler中使用该过滤器
        'filters': ['request_info'],
      },
      'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'standard',
      },
    },
    'loggers': {
      'django': {
        'handlers': ['console'],
        'level': 'ERROR',
        'propagate': False
      },
      'django.request': {
        'handlers': ['console'],
        'level': 'ERROR',
        'propagate': False
      },
      'django.db.backens': {
        'handlers': ['console'],
        'level': 'DEBUG',
        'propagate': False
      },
      'log': {
        'handlers': ['log'],
        'level': 'INFO',
        'propagate': True
      },

    }
  }

5、效果

参考:

给Django日志加上request_id

总结

到此这篇关于django日志默认打印request请求信息的文章就介绍到这了,更多相关django日志默认打印request请求信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 按日期打印Python的Tornado框架中的日志的方法

    网站流量上来后,日志按天甚至小时存储更方便查看和管理,而Python的logging模块也提供了TimedRotatingFileHandler来支持以不同的时间维度归档日志. 然而根据Logging HOWTO的官方指南设置后,却发现新的日志只剩下root的,Tornado内部的logger全部没有生效. 参考stackoverflow上的一个回答,我发现下面的配置能让Tornado内部的logger也用上TimedRotatingFileHandler: # logging.yaml ver

  • python采用requests库模拟登录和抓取数据的简单示例

    如果你还在为python的各种urllib和urlibs,cookielib 头疼,或者还还在为python模拟登录和抓取数据而抓狂,那么来看看我们推荐的requests,python采集数据模拟登录必备利器! 这也是python推荐的HTTP客户端库: 本文就以一个模拟登录的例子来加以说明,至于采集大家就请自行发挥吧. 代码很简单,主要是展现python的requests库的简单至极,代码如下: s = requests.session() data = {'user':'用户名','pass

  • Python 根据日志级别打印不同颜色的日志的方法示例

    本文介绍了Python 根据日志级别打印不同颜色的日志的方法示例,分享给大家,具体如下: # -*-coding:UTF-8-*- import logging import os import time class logger(object): """ 终端打印不同颜色的日志,在pycharm中如果强行规定了日志的颜色, 这个方法不会起作用, 但是 对于终端,这个方法是可以打印不同颜色的日志的. """ #在这里定义StreamHandler

  • Python使用requests发送POST请求实例代码

    本文研究的主要是Python使用requests发送POST请求的相关内容,具体介绍如下. 一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样: 请求行 请求报头 消息主体 HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式.服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析.具体的编码方式包括: application/x-www-form-urlencode

  • Python使用lxml模块和Requests模块抓取HTML页面的教程

    Web抓取 Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档.有时从中 获取数据同时保持它的结构是有用的.web站点不总是以容易处理的格式, 如 csv 或者 json 提供它们的数据. 这正是web抓取出场的时机.Web抓取是使用计算机程序将web页面数据进行收集 并整理成所需格式,同时保存其结构的实践. lxml和Requests lxml(http://lxml.de/)是一个优美的扩展库,用来快速解析XML以及HTML文档 即使所处理的标签非常混乱.我们也将使用 Re

  • Python3使用requests包抓取并保存网页源码的方法

    本文实例讲述了Python3使用requests包抓取并保存网页源码的方法.分享给大家供大家参考,具体如下: 使用Python 3的requests模块抓取网页源码并保存到文件示例: import requests html = requests.get("http://www.baidu.com") with open('test.txt','w',encoding='utf-8') as f: f.write(html.text) 这是一个基本的文件保存操作,但这里有几个值得注意的

  • python logging日志打印过程解析

    一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需要提供日志功能.Python内置的logging模块,为我们提供了现成的高效好用的日志解决方案.但是,不是所有的场景都需要使用logging模块,下面是Python官方推荐的使用方法: 任务场景 最佳工具 普通情况下,在控制台显示输出 print() 报告正常程序操作过程中发生的事件 logging.info()(或者更详细的logging.debug()) 发出有关特定事件的警告 warnings.

  • python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合性的功能.相比于urllib2,Kenneth Reitz的Requests模块更能简约的支持完整的简单用例. 简单的例子: 想象下我们试图使用get方法从http://example.test/获取资源并且查看返回代码,content-type头信息,还有response的主体内容.这件事无论使用

  • python中requests库session对象的妙用详解

    在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有时候需要保持一些共用的数据,例如cookies信息. 妙用1 requests库的session对象能够帮我们跨请求保持某些参数,也会在同一个session实例发出的所有请求之间保持cookies. 举个栗子,跨请求保持cookies,在命令行上输入下面命令: # 创建一个session对象 s = requests.Session() # 用session对象发出get请求,设置cookies s.get('http://ht

  • Python中使用logging模块打印log日志详解

    学一门新技术或者新语言,我们都要首先学会如何去适应这们新技术,其中在适应过程中,我们必须得学习如何调试程序并打出相应的log信息来,正所谓"只要log打的好,没有bug解不了",在我们熟知的一些信息技术中,log4xxx系列以及开发Android app时的android.util.Log包等等都是为了开发者更好的得到log信息服务的.在Python这门语言中,我们同样可以根据自己的程序需要打出log. log信息不同于使用打桩法打印一定的标记信息,log可以根据程序需要而分出不同的l

随机推荐