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

 更新时间:2020年05月17日 16:10:44   作者:歪文  
这篇文章主要给大家介绍了关于django日志默认打印request请求信息的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

需求

请求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请求信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在python中使用SQLAlchemy查询PostgreSQL视图的流程步骤

    在python中使用SQLAlchemy查询PostgreSQL视图的流程步骤

    作为软件开发人员,查询 PostgreSQL 视图是一项常见任务,使用视图(代表SQL 查询输出的虚拟表)被认为是处理关系数据库时的有效方法,本文介绍如何在 Python 中使用 SQLAlchemy 查询 PostgreSQL 视图,需要的朋友可以参考下
    2023-09-09
  • Python相关库设置技巧保护你的C盘

    Python相关库设置技巧保护你的C盘

    这篇文章主要为大家介绍了Python相关库设置,保护你的C盘技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • python合并多个excel文件的示例

    python合并多个excel文件的示例

    这篇文章主要介绍了python合并多个excel文件的示例,帮助大家提高办公效率,感兴趣的朋友可以了解下
    2020-09-09
  • python中定时器的高级使用方式详解

    python中定时器的高级使用方式详解

    在Python编程中,定时器是一种非常有用的工具,用于执行特定任务或函数,本文将介绍一些高级的定时器使用方式,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 浅析Python打包时包含静态文件处理方法

    浅析Python打包时包含静态文件处理方法

    这篇文章主要介绍了Python打包时包含静态文件处理方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Python模块与包管理使用pip与virtualenv

    Python模块与包管理使用pip与virtualenv

    本文深入介绍了使用pipenv管理Python项目的依赖关系和环境,我们首先从pip和virtualenv开始,介绍了它们的基本功能和用法,然后深入探讨了pipenv作为更高级工具的功能和特性,
    2024-03-03
  • python实现异步回调机制代码分享

    python实现异步回调机制代码分享

    本文介绍了python实现异步回调机制的功能,大家参考使用吧
    2014-01-01
  • Python可视化神器pyecharts绘制折线图详情

    Python可视化神器pyecharts绘制折线图详情

    这篇文章主要介绍了Python可视化神器pyecharts绘制折线图详情,折线图和柱状图一样是我们日常可视化最多的一个图例,当然它的优势和适用场景相信大家肯定不陌生,要想快速的得出趋势,抓住趋势二字,就会很快的想到要用折线图来表示了
    2022-07-07
  • 如何让利用Python+AI使静态图片动起来

    如何让利用Python+AI使静态图片动起来

    这篇文章主要介绍了如何让利用Python+AI使静态图片动起来,基于的GAN生成对抗网络围绕主题实现静态图片动起来的效果。具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Python使用cx_Oracle模块操作Oracle数据库详解

    Python使用cx_Oracle模块操作Oracle数据库详解

    这篇文章主要介绍了Python使用cx_Oracle模块操作Oracle数据库,结合实例形式较为详细的分析了cx_Oracle模块的下载、安装及针对Oracle数据库的连接、执行SQL语句、存储过程等相关操作技巧,需要的朋友可以参考下
    2018-05-05

最新评论