[PYTHON] Afficher les informations utilisateur, etc. dans le journal Django

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.

Aperçu

-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']
        },
    },
     ...
}

vues (pour vérification de fonctionnement)

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')

résultat de la sortie du journal

--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')

La source

https://github.com/ping2shi2/DRF-sample

Les références

Recommended Posts

Afficher les informations utilisateur, etc. dans le journal Django
Passer les informations de connexion à afficher dans Django
Comment mettre à jour les informations utilisateur sur Django RemoteUserMiddleware login
[Django] Commande pour générer QuerySet en csv
Sortie du journal Python vers la console avec GAE
Paramètre pour afficher le journal de l'exécution de cron
[Django memo] Je souhaite définir à l'avance les informations de l'utilisateur connecté dans le formulaire.
Ajouter une fonctionnalité pour modifier les informations de quart de jour Django
[CentOS8] Comment afficher la sortie Python standard dans le journal systemd
Paramètres Apache, confirmation du journal, etc. (* Mis à jour de temps en temps)
Journal de sortie vers la console avec Flask + Nginx sur Docker
Implémentez l'extension utilisateur Django et enregistrez les informations jointes
[Python-pptx] Afficher les informations de police PowerPoint au format csv avec python
Vous permet de sélectionner par nom à partir du nom d'utilisateur Django
Sortie PDF avec Django
django a fait des recherches sur la gestion des utilisateurs
Sortie Markdown avec Django
impossible d'importer django
mettre à jour django version 1.11.1 vers 2.2
[Django] Transmettez l'instance utilisateur authentifiée par l'API à ModelSerializer
[Django] Je souhaite me connecter automatiquement après une nouvelle inscription
Exportez les informations produit au format CSV à l'aide de l'API de recherche de produits Rakuten [Python]
Comment générer des informations supplémentaires lors de la sortie de journaux avec le module de journalisation de python
J'ai essayé de sortir le journal d'accès au serveur en utilisant Node.js