91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django日志如何默認打印request請求信息

發布時間:2020-07-23 17:02:46 來源:億速云 閱讀:476 作者:小豬 欄目:開發技術

小編這次要給大家分享的是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日志如何默認打印request請求信息

新的解決方案

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請求信息

看完這篇關于django日志如何默認打印request請求信息的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东源县| 延津县| 福州市| 阿合奇县| 根河市| 海林市| 克山县| 辽阳市| 镇赉县| 天镇县| 尉犁县| 莲花县| 普洱| 盐津县| 伊川县| 贡觉县| 土默特右旗| 湖州市| 洱源县| 安国市| 焦作市| 贵定县| 巴里| 岱山县| 易门县| 鄯善县| 永和县| 论坛| 阳高县| 南开区| 基隆市| 延川县| 洛川县| 祁阳县| 航空| 融水| 梁山县| 和林格尔县| 博客| 宁远县| 鸡泽县|