[PYTHON] [Django] Eine einfache Zusammenfassung der Protokollausgabefunktion, damit auch Anfänger sie verstehen können.

Einführung

Es gibt einige Dinge, die Sie auf den ersten Blick nicht über die Protokollierungsfunktion von Django verstehen. Besonders die Konfigurationsdatei. Ich werde es leicht und präzise zusammenfassen.

Einstellungsdatei für die Produktionsumgebung

Es ist eine Protokolleinstellung, aber wenn Sie sie nicht selbst festlegen (wenn in settings.py keine Definition von LOGGING vorhanden ist) [Standardeinstellung in Django-Quelle enthalten](https://github.com/django/django/ blob / master / django / utils / log.py) wird verwendet. Das Ausgabeprotokoll ist jedoch nicht sehr einfach zu sehen, sodass Sie es in den meisten Fällen selbst festlegen. Das folgende Beispiel zeigt eine Einstellung unter der Annahme einer Produktionsumgebung. Fügen Sie den folgenden Inhalt zu settings.py hinzu.

settings.py


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    #Einstellungen für das Protokollausgabeformat
    'formatters': {
        'production': {
            'format': '%(asctime)s [%(levelname)s] %(process)d %(thread)d '
                      '%(pathname)s:%(lineno)d %(message)s'
        },
    },
    #Handler-Einstellungen
    'handlers': {
        'file': {
            'level': 'INFO',
            'class': 'logging.FileHandler',
            'filename': '/var/log/{}/app.log'.format(PROJECT_NAME),
            'formatter': 'production',
        },
    },
    #Logger-Einstellungen
    'loggers': {
        #Ein Logger, der Protokolle für alle von Ihnen hinzugefügten Anwendungen aufnimmt
        '': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': False,
        },
        #Ein Logger, der alle von Django selbst ausgegebenen Protokolle aufnimmt
        'django': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': False,
        },
    },
}

Anwendungsbeispiel

views.py


import logging

logger = logging.getLogger(__name__)
logger.info("log info test!")
logger.error("log error test!")

Das Protokoll hat je nach Wichtigkeit 5 Ebenen. Sie können das Protokoll ausgeben, indem Sie den Logger die Methode mit demselben Namen wie die Protokollebene wie im obigen Verwendungsbeispiel ausführen lassen.

Name Verwenden
DEBUG Debug-Aufzeichnung
INFO Aufzeichnung des normalen Betriebs
WARNING Warnhinweis
ERROR Schwerwiegende Probleme wie Fehler
CRITICAL Schwerwiegende Probleme wie das Stoppen des Systems

Schauen wir uns die wichtigsten Einstellungselemente an

disable_existing_loggers Im Fall von Ture werden alle nicht in der Konfigurationsdatei definierten Logger deaktiviert. In diesem Stadium fragen Sie sich möglicherweise "Was ist ein Logger, der nicht in der Einstellungsdatei definiert ist?". Die Bedeutung ist jedoch, dass alle Logger mit Namen, die nicht im später beschriebenen Element ** logger ** definiert sind, deaktiviert sind. Getan werden. ** Grundsätzlich ist False OK **, wurde jedoch in diesem Artikel ausführlich überprüft. Überprüfen Sie daher bitte, ob Sie interessiert sind.

formatters Formatierung der Protokollausgabe. Wenn Sie es hier richtig einstellen, wird das Ausgabeformat des Protokolls ausgerichtet und das Protokoll ist leichter zu sehen, sodass Sie denken können, dass eine ** Einstellung erforderlich ist **. Was bedeuten% (asctime) und% (levelname) in Official Documents auf Japanisch Es wird leicht verständlich beschrieben.

handlers Dies ist die Einstellung für die Protokollausgabemethode.

loggers Dies ist die Logger-Einstellung, die tatsächlich von der App verwendet wird. Der durch "''" definierte Logger ist eine Beschreibung, die dem Ausgabebeispiel folgt.

import logging
logger = logging.getLogger(__name__)

Sie können es von jeder Anwendung erhalten. Grundsätzlich reicht es aus, diese und die Logger-Einstellung zu haben, die Django selbst ausgibt.

Das Folgende ist eine Erklärung der Ausbreitung. Der Logger kann tatsächlich einen ** Namespace ** haben. Definieren Sie als Beispiel 'logA'und'logA.logB' wie unten gezeigt.

    'logger': {
        'logA': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': False,
        },
        'logA.logB': {
            'handlers': ['file'],
            'level': 'INFO',
            'propagate': False,
        },

Holen Sie sich dann den Logger wie folgt aus der Anwendung.

views.py


import logging

logger = logging.getLogger('logA.logB.logC')
logger.info("log info test!")

Zu diesem Zeitpunkt ist logC nicht definiert, daher wird ** logB ** als Ergebnis erfasst. Wenn der angegebene Logger nicht vorhanden ist, wird der oben genannte Namespace aufgerufen und der erste gefunden.

Hier, wenn logB und logC ebenfalls definiert sind und die Eigenschaft True ist, für alle logA, logB, logC

logger.info("log info test!")

Wird ausgeführt. Mit anderen Worten, wenn die Einstellungen von logA, logB und logC bis auf den Namen identisch sind, werden ** Protokolle mit genau demselben Inhalt dreimal ausgegeben **. Als Name der Weitergabe wird der Protokollausgabebefehl auch an den Protokollierer in der oberen Hierarchie weitergegeben. Legen Sie als Verwendung logA für die Dateiausgabe, logB für die Konsolenausgabe fest, rufen Sie logA ab, wenn Sie nur die Datei benötigen, rufen Sie logB ab, wenn Sie in der Entwicklungsumgebung auf die Konsole ausgeben möchten usw. Ist es ein solches Bild (ich habe es nie benutzt ...).

das ist alles. Am Ende war der Inhalt etwas kompliziert, aber wenn Sie nichts Kompliziertes tun, sind die Grundeinstellungen meiner Meinung nach nur mit dem in diesem Artikel beschriebenen Inhalt in Ordnung. Vielen Dank für Ihre harte Arbeit: cat2:

Recommended Posts

[Django] Eine einfache Zusammenfassung der Protokollausgabefunktion, damit auch Anfänger sie verstehen können.
Ich habe die Quantenbits (Anfänger) kurz zusammengefasst.
Grundlegende Zusammenfassung des Scrapings mit Anfragen, die Anfänger absolut verstehen können [Python]
Tensorflow scheint es, dass sogar der Eigenwert der Matrix automatisch unterschieden werden kann
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Eine kurze Zusammenfassung von Linux
・ <Slack> Schreiben Sie eine Funktion, um Slack zu benachrichtigen, damit sie jederzeit in Anführungszeichen gesetzt werden kann (Python).
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Verstehen Sie die Anzahl der Eingabe- / Ausgabeparameter des Faltungs-Neuronalen Netzes
Eine kurze Zusammenfassung der Python-Sammlung
Heroku-Bereitstellung der ersten Django-App, von der Anfänger abhängig sind
[Für Anfänger] Super Einführung in neuronale Netze, die selbst Katzen verstehen können
Ich habe das Verhalten von Argsort of Numpy nicht verstanden, deshalb werde ich es zusammenfassen
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Verstehen Sie den Komfort des Django Rest Framework
Eine kurze Zusammenfassung der Pinax-Übersicht #djangoja
[Python] 3 Arten von Bibliotheken, die die Protokollausgabe ein wenig verbessern [logzero, loguru, pyrogrus]
So geben Sie mit Jupyter Notebook einen Wert in der Mitte einer Zelle aus
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Die Geschichte von Django, wie er eine Bibliothek erstellt, die vielleicht etwas nützlicher ist
Lesen Sie das von flask gepostete Bild, damit es von opencv verarbeitet werden kann
Ich habe die Größenänderung von TensorFlow nicht verstanden und sie daher visuell zusammengefasst.
Hackasons Erfahrung, dass es am wichtigsten ist, die Gefühle des Veranstalters zu verstehen
Die SHA-512-Verschlüsselung des Kennworts wurde so geschrieben, dass es automatisiert werden kann, ohne sich um die Ausführungsumgebung zu sorgen.