当前位置: 首页 > 编程笔记 >

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

隗星驰
2023-03-14
本文向大家介绍django日志默认打印request请求信息的方法示例,包括了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模块结构。

  • Loggers
  • Handlers
  • Filters
  • Formatters

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

 类似资料:
  • 本文向大家介绍Django 请求Request的具体使用方法,包括了Django 请求Request的具体使用方法的使用技巧和注意事项,需要的朋友参考一下 1 URL路径参数 在定义路由URL时,使用正则表达式提取参数的方法从URL中获取请求参数,Django会将提取的参数直接传递到视图的传入参数中。 未命名参数按顺序传递, 如 有命名参数按名传递,如 2、 查询字符串Query String 获

  • 本文向大家介绍C#打印日志的方法总结,包括了C#打印日志的方法总结的使用技巧和注意事项,需要的朋友参考一下 在我们对程序进行操作过程中,一般都需要有一个操作流程的记录显示。用C#进行编程时可以很容易实现这个功能。本经验提供案例仅供参考 下面小编就来介绍一下如何使用textbox控件实现日志功能。 打开Visual Studio 2010,建立一个新的C#程序。在工具箱中双击【textbox】控件。

  • 本文向大家介绍请问如何打印日志?相关面试题,主要包含被问及请问如何打印日志?时的应答技巧和注意事项,需要的朋友参考一下 考察点:异常 cat /var/log/*.log 如果日志在更新,如何实时查看tail -f /var/log/messages 还可以使用watch -d -n 1 cat /var/log/messages -d表示高亮不同的地方,-n表示多少秒刷新一次。

  • 本文向大家介绍Django Python 获取请求头信息Content-Range的方法,包括了Django Python 获取请求头信息Content-Range的方法的使用技巧和注意事项,需要的朋友参考一下 request请求头信息的键会加上HTTP_转换成大写存到request.META中 因此你只需要 这样就可以获取到Content-Range的信息。 django官网的解释: A sta

  • 我试图截获一个http请求,以查看发送和接收的实际数据,但日志中没有显示任何内容。 }

  • Vimscript中,我们最先关注的是echo和echom命令。 你可以在Vim中执行:help echo和:help echom命令以查看其帮助文档。读完本书之后, 再次遇到新的命令时,你应该先执行:help命令查看其帮助文档。 执行如下命令,体验echo命令: :::vim :echo "Hello, world!" 你应该会在屏幕的底部看到Hello, world!被打印出来。 还是打印消