So geben Sie zusätzliche Informationen aus, wenn Sie Protokolle mit dem Protokollierungsmodul von Python ausgeben

Einführung

Eine Geschichte über das Ändern der Darstellung von Protokollen, die vom Protokollierungsmodul von Python ausgegeben werden. Es gibt ungefähr drei Möglichkeiten

Zusätzliche Protokollausgabe in dem Umfang, der standardmäßig unterstützt wird

Ausgabe, wenn nichts eingestellt ist

Im Protokollierungsmodul von Python können Sie die Darstellung der Ausgabe ändern, indem Sie das Format ändern.

import logging
logger = logging.getLogger(__name__)

logging.basicConfig(level=logging.DEBUG)

logger.info("hello")
logger.info("bye")

Wenn Sie logging.basicConfig () verwenden, ohne etwas festzulegen, lautet die Ausgabe wie folgt.

INFO:__main__:hello
INFO:__main__:bye

Wenn der für die Protokollausgabe verwendete Formatierer geändert wird

Sie können die Anzeige ändern, indem Sie den Formatierer ändern. Die Änderung selbst kann auch durch Hinzufügen der Formatoption zu basicConfig vorgenommen werden.

import logging
logger = logging.getLogger(__name__)

fmt = "%(asctime)s %(levelname)s %(name)s :%(message)s"
logging.basicConfig(level=logging.DEBUG, format=fmt)
# logging.root.handlers[0].setFormatter(logging.Formatter(fmt=fmt))


logger.info("hello")
logger.info("bye")

Die Ausgabe wird wie folgt sein.

2016-10-10 19:49:50,692 INFO __main__ :hello
2016-10-10 19:49:50,693 INFO __main__ :bye

Sie können standardmäßig tun, was Sie können. Die folgenden Informationen können hinzugefügt werden.

--asctime --current time --levelname --Log Level (z. B. DEBUG, INFO, ERROR, ...) --message --Message (Zeichenfolge an logger.info () usw. übergeben) --pathname - Der physische Pfad (absoluter Pfad), von dem aus das Protokoll aufgerufen wurde --funcName - Der Name der Funktion, von der das Protokoll aufgerufen wurde

Siehe unten für Details.

http://docs.python.jp/3/library/logging.html#logrecord-attributes

Protokollausgabe durch Übergabe zusätzlicher Informationen beim Übergeben der Protokollausgabe

Es ist möglich, zusätzliche Informationen zum Zeitpunkt der Ausgabe hinzuzufügen, indem bei jeder Ausgabe des Protokolls zusätzliche Informationen übergeben werden. Geben Sie insbesondere die zusätzliche Option an. Der Wert im Diktat, der durch die zusätzliche Option angegeben wird, wird vom Formatierer der Protokollausgabe berührt. (Um genau zu sein, wird es in __dict__ des LogRecord-Objekts gespeichert.)

Aktualisieren wir beispielsweise die Informationen zu Wer und Kosten wie folgt. Sie können die Mini-Sprachnotation von Formatzeichenfolgen grob zum Formatieren von Zeichenfolgen verwenden.

import logging
import random
logger = logging.getLogger(__name__)

fmt = "%(message)10s [who=%(who)s cost=%(cost).5f]"
logging.basicConfig(level=logging.DEBUG, format=fmt)

logger.info("hello", extra={"who": "foo", "cost": random.random() * 5})
logger.info("bye", extra={"who": "foo", "cost": random.random() * 5})

Die Ausgabe wird wie folgt sein.

     hello [who=foo cost=2.48451]
       bye [who=foo cost=0.79263]

Beachten Sie übrigens, dass KeyError auftritt, wenn Informationen fehlen.

logger.info("noop")  # KeyError: 'who'

Protokollausgabe mit spezifischen Informationen, die allen Protokollausgaben hinzugefügt wurden

Es gibt Zeiten, in denen Sie immer bestimmte Informationen hinzufügen möchten, anstatt sie jedes Mal weiterzugeben. In diesem Fall ist es besser, LogRecordFactory zu ändern.

Fügen wir beispielsweise die Anzahl der Protokolle derselben Nachricht (gezählt nach fmt-Zeichenfolge) mit dem Namen call_count hinzu und zeigen sie an.

import logging
from collections import defaultdict
logger = logging.getLogger(__name__)


class Extension:
    def __init__(self):
        self.c = defaultdict(int)


class LogRecordExtension(logging.LogRecord):
    extension = Extension()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.extension.c[self.msg] += 1
        self.call_count = self.extension.c[self.msg]


if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s[%(call_count)d]")
    logging.setLogRecordFactory(LogRecordExtension)

    logger.info("hello")
    logger.info("hello")

    logger.info("%s: hello", "foo")
    logger.info("%s: hello", "bar")

Die Ausgabe wird wie folgt sein.

2016-10-10 20:01:33,337 INFO hello[1]
2016-10-10 20:01:33,338 INFO hello[2]
2016-10-10 20:01:33,338 INFO foo: hello[1]
2016-10-10 20:01:33,338 INFO bar: hello[2]

Recommended Posts

So geben Sie zusätzliche Informationen aus, wenn Sie Protokolle mit dem Protokollierungsmodul von Python ausgeben
Verwendung des Python-Protokollierungsmoduls
So aktualisieren Sie Benutzerinformationen bei der Django RemoteUserMiddleware-Anmeldung
Umgang mit Fehlern beim Auftreffen auf pip pip
So lesen Sie ein Array mit Pythons ConfigParser
Wie man Zufallszahlen mit dem Zufallsmodul von NumPy macht
Zugriff mit dem Cache beim Lesen von_json mit Pandas
So geben Sie die CSV eines mehrzeiligen Headers mit Pandas aus
[Python-pptx] Gibt PowerPoint-Schriftinformationen mit Python in CSV aus
Umgang mit statischen Dateien bei der Bereitstellung in der Produktion mit Django
So geben Sie ein Dokument im PDF-Format mit Sphinx aus
Mindestkenntnisse, um mit dem Python-Protokollierungsmodul zu beginnen
So laden Sie keine Bilder, wenn Sie PhantomJS mit Selen verwenden
So drucken Sie Zeichen als Tabelle mit der Druckfunktion von Python
Wie aktualisiere ich mit SQLAlchemy?
So lösen Sie den CSRF-Schutz bei Verwendung von AngularJS mit Django
Wie man mit Theano besetzt
Wie mit SQLAlchemy ändern?
So trennen Sie Zeichenfolgen mit ','
Wie man RDP auf Fedora31 macht
[GCP] Ausgeben von Cloud-Funktionsprotokollen an Cloud Logging (Stackdriver Logging) (Python)
Umgang mit UnicodeDecodeError beim Ausführen des Downloads von Google-Bildern
Wie lösche ich mit SQLAlchemy?
Umgang mit dem Fehler "Fehler beim Laden des Moduls" canberra-gtk-module ", der beim Ausführen von OpenCV auftritt
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
Umgang mit Fehlern bei der Installation von Whitenoise und der Bereitstellung auf Heroku
Umgang mit Fehlern bei der Installation von Python und Pip mit Choco
[Tipps] Die Vorgehensweise beim Erstellen von HTML mit Django wird erweitert
Python: So verwenden Sie Async mit
Verwendung des optparse-Moduls
Ausgabe in eine CSV-Datei mit Python
So verwenden Sie virtualenv mit PowerShell
So installieren Sie Python-Pip mit Ubuntu20.04LTS
Umgang mit unausgeglichenen Daten
So fügen Sie sudo hinzu, wenn Sie das Debug ausführen
Sortieren Sie Namen mit dem Zufallsmodul von Python
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Umgang mit dem DistributionNotFound-Fehler
Wie fange ich mit Django an?
So überschreiben Sie die Ausgabe auf die Konsole
So berechnen Sie das Datum mit Python
So installieren Sie den MySQL-Connector mit pip3
Versuchen Sie, Audio mit M5 STACK auszugeben
Verwendung des ConfigParser-Moduls
So installieren Sie Anaconda mit pyenv
Verwendung des Python-Kontextmanagers
[HOW TO] Einfache Möglichkeit zum Debuggen beim Generieren einer PDF-Datei mit PHP usw.
[PostgreSQL] Gewähren der Superuser-Berechtigung, wenn die Anzahl der Benutzer (Rollen) mit Superuser-Berechtigung 0 beträgt.
[Yahoo! Weather Replacement Version] So erhalten Sie Wetterinformationen mit LINE Notify + Python
Umgang mit OAuth2-Fehlern bei Verwendung von Google APIs aus Python