django日志默認(rèn)打印request請(qǐng)求信息的方法示例
需求
請(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)雅。
新的解決方案
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、效果
參考:
總結(jié)
到此這篇關(guān)于django日志默認(rèn)打印request請(qǐng)求信息的文章就介紹到這了,更多相關(guān)django日志默認(rèn)打印request請(qǐng)求信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例
- Django 使用logging打印日志的實(shí)例
- Django日志模塊logging的配置詳解
- Django日志及中間件模塊應(yīng)用案例
- django實(shí)現(xiàn)日志按日期分割
- Django在Model保存前記錄日志實(shí)例
- 如何在django中添加日志功能
- 基于Django實(shí)現(xiàn)日志記錄報(bào)錯(cuò)信息
- Django多進(jìn)程滾動(dòng)日志問(wèn)題解決方案
- Django使用uwsgi部署時(shí)的配置以及django日志文件的處理方法
- Django項(xiàng)目如何正確配置日志(logging)
相關(guān)文章
在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-09Python相關(guān)庫(kù)設(shè)置技巧保護(hù)你的C盤(pán)
這篇文章主要為大家介紹了Python相關(guān)庫(kù)設(shè)置,保護(hù)你的C盤(pán)技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11淺析Python打包時(shí)包含靜態(tài)文件處理方法
這篇文章主要介紹了Python打包時(shí)包含靜態(tài)文件處理方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01python實(shí)現(xiàn)異步回調(diào)機(jī)制代碼分享
本文介紹了python實(shí)現(xiàn)異步回調(diào)機(jī)制的功能,大家參考使用吧2014-01-01Python可視化神器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),基于的GAN生成對(duì)抗網(wǎng)絡(luò)圍繞主題實(shí)現(xiàn)靜態(tài)圖片動(dòng)起來(lái)的效果。具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Python使用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