TRACE-Protokollebene zu Python hinzufügen ...?

Kurz gesagt: Hören wir auf

Bitte lesen Sie das Folgende als Geschichte.

Was für eine Anfrage ist das überhaupt?

log4j (http://ja.wikipedia.org/wiki/Log4j) hat eine Ebene namens TRACE unter DEBUG. Ich denke, das ist eine sehr Ameisenfunktion.

Zum Beispiel am Anfang und am Ende einer Funktion "gestartet!" Und "beendet!" Wenn Sie auf der TRACE-Protokollebene oder `` LOG.trace () `usw. schreiben und den Prozess mit DEBUG in die Mitte schreiben, Es ist, als könnte man mehrere Stufen wie -vv (im Fall von ssh) für -v auf einer etwas aussagekräftigeren Ebene definieren. Wenn ein Käfer kommt, ist Gras unvermeidlich.

Während der Entwicklung kann es hilfreich sein, auf Protokollebene zu wissen, "welche Funktion bis zum Ende funktioniert hat". Es ist nicht immer möglich, den Debugger in der gesamten Story auszuführen, und irgendwie verwende ich "printf debug". Hilfe.

Etwas wie TRACE einzustellen scheint "nichts zu sein, was man nicht tun kann".

Python-Protokollstufen sind in erster Linie numerisch, und DEBUG, INFO usw. werden tatsächlich numerischen Werten zugeordnet.

https://docs.python.org/3.4/library/logging.html#logging-levels

Wenn Sie beispielsweise ein Protokoll ausspucken, schreiben Sie wie folgt

logging.debug ('sollte nicht so geschrieben werden') logging.log (logging.DEBUG, 'Also!')

(Eigentlich können Sie Logger verwenden)

Da logging.DEBUG einfach 10 ist, repräsentiert die obige Notation effektiv die Ausgabe auf derselben Protokollstufe wie die folgende Notation.

logging.log (10, 'Nmo!')

NOTSET (0) ist etwas Besonderes. Lassen wir es also beiseite, und selbst wenn Sie Zahlen von 1 bis 9 verwenden, wird sich die Protokollfunktion nicht beschweren. Im Gegenteil, DEBUG und INFO werden einfach als Aliase für Zahlen behandelt.

Wie wir später sehen werden, akzeptieren einige Mechanismen derzeit nur Zahlen (z. B. `logging.log (lvl, msg)` lvl ist eine Zahl und akzeptiert nicht 'DEBUG' usw. )

Wenn Sie also eine Zahl wie 5 angeben und `` logging.log (5, 'wafu') usw. schreiben, können Sie setLevel (logging.DEBUG) `state logger schreiben. Wird nicht angezeigt.

Wenn Sie so etwas wie TRACE ausführen, indem Sie numerische Werte angeben, sieht es wie folgt aus.

from logging import getLogger, StreamHandler, DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
logger.setLevel(DEBUG)
handler.setLevel(DEBUG)
logger.addHandler(handler)

logger.log (5, 'Ich fange an') .. logger.debug ('Das ist groß') .. logger.log (5, 'Es ist vorbei')

Im obigen Beispiel werden "Start" und "Ende" nicht angezeigt. Es ist nur "Das ist groß". Ein Weg, um Debug-Protokolle zu erhalten, die wirklich nur für Entwickler wertvoll sind Persönlich finde ich es nicht schrecklich. Oder eher bequem.

Ich möchte auch logging.trace () und logger.trace ()!

Hier hat die Protokollierung eine Funktion namens `addLevelName ()`. (https://docs.python.org/3.4/library/logging.html#logging.addLevelName)

Oh, das ist `logger.trace ()`

Nicht gemacht :-)

logging.trace()Und Logger.trace()Wird nicht gemacht, geschweige denn protokolliert.log('TRACE', 'Hallo')Ich kann es nicht machen An erster Stelle anmelden.log('INFO', 'Lassen Sie uns einfügen')Nicht einmal erlaubt.



 # Sie können so etwas wie `` `logger.setLevel ('INFO')` `` angeben (um genau zu sein, es scheint nur die neueste Version nach 3.2 zu sein. Aus irgendeinem Grund enthält es auch 2.7). Es ist auch möglich, `` --log = DEBUG``` mit argparse anzugeben und direkt in `` `setLevel ()` `einzufügen.

 Wahrscheinlich ist dies nur eine Funktion, bei der `` `Formatter```" TRACE "anstelle von" Level 5 "anzeigt, nicht wahr?

 (wie Ipython)
    > import logging
    > logger = logging.getLogger('test')
    > logger.setLevel(1)
    > handler = logging.StreamHandler()
    > handler.setLevel(1)
    > formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    > handler.setFormatter(formatter)
    > logger.addHandler(handler)
    >  logger.debug('hello')
    2014-05-01 11:02:12,743 - DEBUG - hello
    > logger.log(5, 'hoge')
    2014-05-01 11:02:20,599 - Level 5 - hoge
    > logging.addLevelName(5, 'TRACE')
    > logger.log(5, 'hoge')
    2014-05-01 11:02:43,173 - TRACE - hoge

 Um genau zu sein, wenn Sie mit dem Inhalt der Murikuri-Protokollierung herumspielen, können Sie möglicherweise `` `logging.trace ()` `` usw. hinzufügen. Es ist Python.

 Es existiert jedoch standardmäßig nicht als nette und sichere Implementierung, und ich denke nicht, dass es in Zukunft in diese Richtung geht.

 Selbst wenn ich es könnte, kann ich sehen, dass es einfach super lästig ist.
 Es kann nicht gesagt werden, dass der von jeder Funktion oder dergleichen empfangene Logger es immer hat. Insbesondere wenn es als Bibliothek bereitgestellt wird, ist es sichtbar, dass Logger, die Trace nicht kennen, von außen kommen.
 Manchmal habe ich eine Spur oder nicht, also frage ich mich, ob ich sie beim Überprüfen mit getattr verwende.
 Bequemlichkeit ist nicht in Ordnung.

# Erstens sagt der Beamte so etwas wie "Tu es nicht".

https://docs.python.org/2/howto/logging.html#custom-levels

> Defining your own levels is possible, but should not be necessary, as the existing levels have been chosen on the basis of practical experience. However, if you are convinced that you need custom levels, great care should be exercised when doing this, and it is possibly a very bad idea to define custom levels if you are developing a library. That’s because if multiple library authors all define their own custom levels, there is a chance that the logging output from such multiple libraries used together will be difficult for the using developer to control and/or interpret, because a given numeric value might mean different things for different libraries.

https://docs.python.org/3.2/howto/logging.html#custom-levels

> Defining your own levels is possible, but should not be necessary, as the existing levels have been chosen on the basis of practical experience. However, if you are convinced that you need custom levels, great care should be exercised when doing this, and it is possibly a very bad idea to define custom levels if you are developing a library. That’s because if multiple library authors all define their own custom levels, there is a chance that the logging output from such multiple libraries used together will be difficult for the using developer to control and/or interpret, because a given numeric value might mean different things for different libraries.

https://docs.python.org/3.4/howto/logging.html#custom-levels

> Defining your own levels is possible, but should not be necessary, as the existing levels have been chosen on the basis of practical experience. However, if you are convinced that you need custom levels, great care should be exercised when doing this, and it is possibly a very bad idea to define custom levels if you are developing a library. That’s because if multiple library authors all define their own custom levels, there is a chance that the logging output from such multiple libraries used together will be difficult for the using developer to control and/or interpret, because a given numeric value might mean different things for different libraries.

# Fazit

 Lass uns anhalten

 Wenn Sie es verwenden, bereiten Sie einen bestimmten Handler vor, der ein sehr ausführliches Protokoll als "Debug" -Protokoll für einen Fehler ausspuckt, den der Entwickler nicht verstehen kann. Setzen Sie nur diesen Handler auf Protokollstufe 1, und die anderen sind mit DEBUG matschig. Reicht es aus, mit solchen mehreren Schritten umzugehen?

 Ganz am Ende meines Bestehens auf "Lass uns aufhören" war ich überzeugt, dass "Oh, dann kann ich nicht vergeben", und das war's.


Recommended Posts

TRACE-Protokollebene zu Python hinzufügen ...?
Versuchen Sie, Trace in Python zu berechnen
So ändern Sie die Protokollstufe von Azure SDK für Python
Python-Protokoll mit GAE an die Konsole ausgeben
Melden Sie sich mit Anforderungen in Python bei Slack an
[Python] Fügen Sie Pandas DataFrame insgesamt Zeilen hinzu
Fügen Sie Bildern mit Python2.7 Gaußsches Rauschen hinzu
So fügen Sie der Anaconda-Umgebung ein Python-Modul hinzu
Fügen Sie VSCode eine virtuelle Python-Umgebung hinzu
[Python] Fügen Sie der Standardeingabedatei einen Kommentar hinzu
Auf Python 2.7.9 aktualisiert
"Backport" zu Python 2
Fügen Sie der Heatmap (Python, Matplotlib) eine diagonale Linie (Schraffur) hinzu.
So fügen Sie einen Suchpfad für Python-Module hinzu
Geschwindigkeit: Element am Ende des Python-Arrays hinzufügen
[CentOS8] So geben Sie die Standard-Python-Ausgabe in das Systemd-Protokoll aus
[Python] [Django] Verwendung des Auswahlfelds und Hinzufügen von Optionen
So fügen Sie HDA Hilfe hinzu (mit Python-Skriptbonus)
Änderungen von Python 3.0 zu Python 3.5
So installieren Sie Python
Einführung in die Python-Sprache
Beachten Sie, dass Python ein Daemon ist
So fügen Sie einer PDF-Datei Seitenzahlen hinzu (in Python)
Einführung von Python 2.7 in CentOS 6.6
Verbinden Sie Python mit MySQL
Python-Protokollierungsstandardbibliothek für die Dateiausgabe nach Protokollebene
[GCP] Ausgeben von Cloud-Funktionsprotokollen an Cloud Logging (Stackdriver Logging) (Python)
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Stellen Sie mit Python eine Verbindung zu BigQuery her
[Neueste Version 2020.8] So installieren Sie Python
[Python] Datum in Zeichenfolge konvertieren
Post von Python nach Slack
So installieren Sie Python [Windows]
poste an vim → Python → Slack
Einführung in Python Django (2) Win
So löschen Sie stdout in Python
Konvertieren Sie numpy int64 in python int
python3: Verwendung der Flasche (2)
Hinzufügen / Entfernen des Kernels zu JupyterLab
[Python] Liste in Pandas konvertieren [Pandas]
Flirte von PHP nach Python
Ein Weg zum mittleren Python
Versuchen Sie, Python selbst zu verstehen
Python-Notizen, die Sie bald vergessen sollten
[Python] Verwendung von Liste 1
Fügen Sie MeCab ein Wörterbuch hinzu
Melden Sie sich auf der Website in Python an
Stellen Sie mit Python eine Verbindung zu Wikipedia her
So aktualisieren Sie Pythons Tkinter auf 8.6
Post to Slack mit Python 3
Seitenzahl zu PDF hinzufügen
Anaconda aktualisiert von 4.2.0 auf 4.3.0 (python3.5 aktualisiert auf python3.6)
Mit Python auf Twitter posten
Wie benutzt man Python Argparse?
Starten Sie mit Python zu Selen
Einführung in die serielle Kommunikation [Python]