欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django日志默認(rèn)打印request請(qǐng)求信息的方法示例

 更新時(shí)間:2020年05月17日 16:10:44   作者:歪文  
這篇文章主要給大家介紹了關(guān)于django日志默認(rèn)打印request請(qǐng)求信息的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

需求

請(qǐng)求view中手動(dòng)打印日志時(shí)中插入request的如下信息(每個(gè)request請(qǐng)求都記錄可以使用中間件進(jìn)行解決,但這里僅僅是在需要的地方手動(dòng)打?。?/p>

 #統(tǒng)一附加日志內(nèi)容

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

舊的解決辦法

在每次需要打印日志時(shí),通過(guò) logging extra 進(jìn)行額外的打印信息添加:每次手動(dòng)添加同樣的extra非常的不優(yōu)雅。

新的解決方案

django 自帶log系統(tǒng)官方文檔

1、熟悉python的logging模塊結(jié)構(gòu)。

2、django中間件存儲(chǔ)request信息。

class RequestLogMiddleware(MiddlewareMixin):
  """
  將request的信息記錄在當(dāng)前的請(qǐng)求線(xiàn)程上
  """
  def process_request(self, request):
    # 統(tǒng)一附加日志內(nèi)容
    # 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):
  """
  日志過(guò)濾器,將當(dāng)前請(qǐng)求線(xiàn)程的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、實(shí)現(xiàn)原理及代碼

通過(guò) 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):
  """
  日志過(guò)濾器,將當(dāng)前請(qǐng)求線(xiàn)程的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的信息記錄在當(dāng)前的請(qǐng)求線(xiàn)程上。
  """
  def process_request(self, request):
    # 統(tǒng)一附加日志內(nèi)容
    # 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' 
   #使用該中間件
   #將當(dāng)前的request信息保存到當(dāng)前線(xiàn)程供日志打印使用
]


LOGGING = {
    # 日志相關(guān)
    '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': {
       #該格式化中包含有過(guò)濾器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': {
      #注冊(cè)該過(guò)濾器
      'request_info': {'()': 'wcloud.middleware-waiwen.RequestLogFilter'}
    },
    'handlers': {
      'log': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'custom',
       #在該過(guò)handler中使用該過(guò)濾器
        '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

總結(jié)

到此這篇關(guān)于django日志默認(rèn)打印request請(qǐng)求信息的文章就介紹到這了,更多相關(guān)django日志默認(rèn)打印request請(qǐng)求信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在python中使用SQLAlchemy查詢(xún)PostgreSQL視圖的流程步驟

    在python中使用SQLAlchemy查詢(xún)PostgreSQL視圖的流程步驟

    作為軟件開(kāi)發(fā)人員,查詢(xún) PostgreSQL 視圖是一項(xiàng)常見(jiàn)任務(wù),使用視圖(代表SQL 查詢(xún)輸出的虛擬表)被認(rèn)為是處理關(guān)系數(shù)據(jù)庫(kù)時(shí)的有效方法,本文介紹如何在 Python 中使用 SQLAlchemy 查詢(xún) PostgreSQL 視圖,需要的朋友可以參考下
    2023-09-09
  • Python相關(guān)庫(kù)設(shè)置技巧保護(hù)你的C盤(pán)

    Python相關(guān)庫(kù)設(shè)置技巧保護(hù)你的C盤(pán)

    這篇文章主要為大家介紹了Python相關(guān)庫(kù)設(shè)置,保護(hù)你的C盤(pán)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • python合并多個(gè)excel文件的示例

    python合并多個(gè)excel文件的示例

    這篇文章主要介紹了python合并多個(gè)excel文件的示例,幫助大家提高辦公效率,感興趣的朋友可以了解下
    2020-09-09
  • python中定時(shí)器的高級(jí)使用方式詳解

    python中定時(shí)器的高級(jí)使用方式詳解

    在Python編程中,定時(shí)器是一種非常有用的工具,用于執(zhí)行特定任務(wù)或函數(shù),本文將介紹一些高級(jí)的定時(shí)器使用方式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • 淺析Python打包時(shí)包含靜態(tài)文件處理方法

    淺析Python打包時(shí)包含靜態(tài)文件處理方法

    這篇文章主要介紹了Python打包時(shí)包含靜態(tài)文件處理方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Python模塊與包管理使用pip與virtualenv

    Python模塊與包管理使用pip與virtualenv

    本文深入介紹了使用pipenv管理Python項(xiàng)目的依賴(lài)關(guān)系和環(huán)境,我們首先從pip和virtualenv開(kāi)始,介紹了它們的基本功能和用法,然后深入探討了pipenv作為更高級(jí)工具的功能和特性,
    2024-03-03
  • python實(shí)現(xiàn)異步回調(diào)機(jī)制代碼分享

    python實(shí)現(xiàn)異步回調(diào)機(jī)制代碼分享

    本文介紹了python實(shí)現(xiàn)異步回調(diào)機(jī)制的功能,大家參考使用吧
    2014-01-01
  • Python可視化神器pyecharts繪制折線(xiàn)圖詳情

    Python可視化神器pyecharts繪制折線(xiàn)圖詳情

    這篇文章主要介紹了Python可視化神器pyecharts繪制折線(xiàn)圖詳情,折線(xiàn)圖和柱狀圖一樣是我們?nèi)粘?梢暬疃嗟囊粋€(gè)圖例,當(dāng)然它的優(yōu)勢(shì)和適用場(chǎng)景相信大家肯定不陌生,要想快速的得出趨勢(shì),抓住趨勢(shì)二字,就會(huì)很快的想到要用折線(xiàn)圖來(lái)表示了
    2022-07-07
  • 如何讓利用Python+AI使靜態(tài)圖片動(dòng)起來(lái)

    如何讓利用Python+AI使靜態(tài)圖片動(dòng)起來(lái)

    這篇文章主要介紹了如何讓利用Python+AI使靜態(tài)圖片動(dòng)起來(lái),基于的GAN生成對(duì)抗網(wǎng)絡(luò)圍繞主題實(shí)現(xiàn)靜態(tài)圖片動(dòng)起來(lái)的效果。具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫(kù)詳解

    Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫(kù)詳解

    這篇文章主要介紹了Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫(kù),結(jié)合實(shí)例形式較為詳細(xì)的分析了cx_Oracle模塊的下載、安裝及針對(duì)Oracle數(shù)據(jù)庫(kù)的連接、執(zhí)行SQL語(yǔ)句、存儲(chǔ)過(guò)程等相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05

最新評(píng)論