Lorsque vous essayez de générer des informations qui ne figurent pas dans l 'attribut LogRecord telles que demander des informations utilisateur dans le journal Django,
logger.info(message, extra={'username' : request.user.username})
Vous pouvez trouver quelque chose comme ça, mais c'est un peu différent. Il y avait une solution quand je pensais qu'il y avait des développeurs qui ne suivaient pas les règles et que cela ne fonctionnait que pour les logs que j'avais écrits.
-Utilisez Middleware pour définir les informations utilisateur sur threading.local () lors de la demande --Ajoutez les informations utilisateur de threading.local () à LogRecord avec logging.filter --LOGGING paramètres dans settings.py
Middleware
python
import logging
import threading
local = threading.local()
class CustomAttrMiddleware:
"""
Middleware pour obtenir des éléments personnalisés à afficher dans le journal
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
"""
Obtenez le nom d'utilisateur de la demande lors de la demande du client
threading.local()Enregistrer temporairement dans
"""
if request.user:
setattr(local, 'user', request.user.username)
else:
setattr(local, 'user', None)
response = self.get_response(request)
#Effacer en répondant
setattr(local, 'user', None)
return response
filter
python
class CustomAttrFilter(logging.Filter):
"""
filtre pour la sortie des éléments personnalisés dans le journal
"""
def filter(self, record):
record.user = getattr(local, 'user', None)
return True
settings.py
python
MIDDLEWARE = [
...
'middleware.custom_logging.CustomAttrMiddleware',
]
LOGGING = {
...
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s '
'%(process)d %(thread)d user=%(user)s %(message)s'
},
},
'filters' : {
'custom': {
'()': 'middleware.custom_logging.CustomAttrFilter'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose',
'filters': ['custom']
},
},
...
}
python
class LoggingExceptListView(generics.ListAPIView):
"""
ListView pour voir la sortie d'exception dans le journal
"""
def list(self, request, *args, **kwargs):
"""
Soulevez simplement une exception
"""
raise Exception('Pour vérifier les journaux')
--Exécuter les vues de contrôle des opérations ci-dessus --La partie "user = CustomAttrUser" du journal ci-dessous
python
ERROR 2020-05-06 17:12:02,703 log 13516 10376 user=CustomAttrUser Internal Server Error: /sample_api/logging-exp/
Traceback (most recent call last):
File "C:\ProgramData ...
... raise Exception('Pour vérifier les journaux')
https://github.com/ping2shi2/DRF-sample
Recommended Posts