[PYTHON] Benutzerinformationen usw. in das Django-Protokoll ausgeben

Wenn Sie versuchen, Informationen auszugeben, die nicht im [LogRecord-Attribut] enthalten sind (https://docs.python.org/ja/3/library/logging.html#logrecord-attributes), z. B. Benutzerinformationen an das Django-Protokoll anfordern,

logger.info(message, extra={'username' : request.user.username})

Sie können so etwas finden, aber es ist ein bisschen anders. Es gab eine Lösung, als ich dachte, dass es Entwicklungsmitglieder gibt, die sich nicht an die Regeln halten, und dass dies nur für die von mir geschriebenen Protokolle funktioniert.

Überblick

Middleware

python



import logging
import threading

local = threading.local()

class CustomAttrMiddleware:
    """
Middleware, um benutzerdefinierte Elemente zur Protokollierung auszugeben
    """
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        """
Rufen Sie den Benutzernamen der Anfrage ab, wenn Sie vom Client eine Anfrage stellen
        threading.local()Vorübergehend speichern bis
        """
        if request.user:
            setattr(local, 'user', request.user.username)
        else:
            setattr(local, 'user', None)

        response = self.get_response(request)

        #Klar, wenn Sie antworten
        setattr(local, 'user', None)

        return response

filter

python


class CustomAttrFilter(logging.Filter):
    """
Filter für die Ausgabe von benutzerdefinierten Elementen zum Protokollieren
    """
    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']
        },
    },
     ...
}

Ansichten (zur Funktionsprüfung)

python


class LoggingExceptListView(generics.ListAPIView):
    """
ListView, um die Ausnahmeausgabe im Protokoll anzuzeigen
    """
    def list(self, request, *args, **kwargs):
        """
Erhöhen Sie einfach eine Ausnahme
        """
        raise Exception('Zum Überprüfen von Protokollen')

Ergebnis der Protokollausgabe

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('Zum Überprüfen von Protokollen')

Quelle

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

Verweise

Recommended Posts

Benutzerinformationen usw. in das Django-Protokoll ausgeben
Übergeben Sie Login-Benutzerinformationen, um sie in Django anzuzeigen
So aktualisieren Sie Benutzerinformationen bei der Django RemoteUserMiddleware-Anmeldung
[Django] Befehl zum Ausgeben von QuerySet an csv
Python-Protokoll mit GAE an die Konsole ausgeben
Einstellung zur Ausgabe des Protokolls zur Ausführung von cron
[Django-Memo] Ich möchte die angemeldeten Benutzerinformationen im Voraus im Formular festlegen.
Fügen Sie Funktionen zum Ändern der Django-Tagesschichtinformationen hinzu
[CentOS8] So geben Sie die Standard-Python-Ausgabe in das Systemd-Protokoll aus
Apache-Einstellungen, Protokollbestätigung usw. (* Von Zeit zu Zeit aktualisiert)
Ausgabeprotokoll an die Konsole mit Flask + Nginx auf Docker
Implementieren Sie die Django-Benutzererweiterung und registrieren Sie die angehängten Informationen
[Python-pptx] Gibt PowerPoint-Schriftinformationen mit Python in CSV aus
Ermöglicht die Auswahl nach Namen aus dem Django-Benutzernamen
PDF mit Django ausgeben
Django recherchierte über Benutzerverwaltung
Markdown-Ausgabe mit Django
Django kann nicht importiert werden
Aktualisieren Sie die Django-Version 1.11.1 auf 2.2
[Django] Übergeben Sie die von der API authentifizierte Benutzerinstanz an ModelSerializer
[Django] Ich möchte mich nach einer neuen Registrierung automatisch anmelden
Ausgabe von Produktinformationen an csv mithilfe der Rakuten-Produktsuch-API [Python]
So geben Sie zusätzliche Informationen aus, wenn Sie Protokolle mit dem Protokollierungsmodul von Python ausgeben
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben