django日志默認打印request請求信息的方法示例
需求
請求view中手動打印日志時中插入request的如下信息(每個request請求都記錄可以使用中間件進行解決,但這里僅僅是在需要的地方手動打印):
#統(tǒng)一附加日志內容
ADD_LOG = r'''{"username": request.user, "path": request.path, "request_id": request.id, "login_id": request.login_id}'''
舊的解決辦法
在每次需要打印日志時,通過 logging extra 進行額外的打印信息添加:每次手動添加同樣的extra非常的不優(yōu)雅。

新的解決方案
1、熟悉python的logging模塊結構。
2、django中間件存儲request信息。
class RequestLogMiddleware(MiddlewareMixin):
"""
將request的信息記錄在當前的請求線程上
"""
def process_request(self, request):
# 統(tǒng)一附加日志內容
# 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、實現(xiàn)原理及代碼
通過 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):
# 統(tǒng)一附加日志內容
# 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請求信息內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
在python中使用SQLAlchemy查詢PostgreSQL視圖的流程步驟
作為軟件開發(fā)人員,查詢 PostgreSQL 視圖是一項常見任務,使用視圖(代表SQL 查詢輸出的虛擬表)被認為是處理關系數據庫時的有效方法,本文介紹如何在 Python 中使用 SQLAlchemy 查詢 PostgreSQL 視圖,需要的朋友可以參考下2023-09-09
Python使用cx_Oracle模塊操作Oracle數據庫詳解
這篇文章主要介紹了Python使用cx_Oracle模塊操作Oracle數據庫,結合實例形式較為詳細的分析了cx_Oracle模塊的下載、安裝及針對Oracle數據庫的連接、執(zhí)行SQL語句、存儲過程等相關操作技巧,需要的朋友可以參考下2018-05-05

