it-swarm.com.de

Warum sollten Sie in Python die Protokollierung statt des Druckens verwenden?

Gibt es für ein einfaches Debuggen in einem komplexen Projekt einen Grund, den Python-Logger anstelle des Druckens zu verwenden? Was ist mit anderen Anwendungsfällen? Gibt es für jeden einen akzeptierten besten Anwendungsfall (besonders wenn Sie nur nach Standard suchen)?

Ich habe immer gehört, dass dies eine "Best Practice" ist, aber ich konnte nicht herausfinden, warum.

52
Sam Odio

Das Protokollierungspaket bietet viele nützliche Funktionen:

  • Es ist leicht zu erkennen, wo und wann (sogar welche Leitung Nr.) Ein Protokollierungsruf ausgeführt wird.
  • Sie können sich gleichzeitig in Dateien, Sockets und so ziemlich alles einloggen.
  • Sie können Ihre Protokollierung nach Schweregrad unterscheiden.

Print hat keine davon.

Wenn Ihr Projekt auch von anderen Python-Werkzeugen importiert werden soll, ist es schlechte Praxis, dass Ihr Paket Dinge in stdout druckt, da der Benutzer wahrscheinlich nicht weiß, woher die Drucknachrichten kommen. Bei der Protokollierung können Benutzer Ihres Pakets wählen, ob Sie Protokollnachrichten von Ihrem Tool aus propagieren möchten oder nicht.

63
user297250

Einer der größten Vorteile einer ordnungsgemäßen Protokollierung besteht darin, dass Sie Nachrichten kategorisieren und je nach Bedarf ein- oder ausschalten können. Es kann zum Beispiel nützlich sein, Debugging-Meldungen für einen bestimmten Teil des Projekts zu aktivieren, aber für andere Teile abzustimmen, um nicht von Informationsüberflutung übernommen zu werden und sich leicht auf die Aufgabe zu konzentrieren, für die Sie dies benötigen Protokollierung.

Protokolle sind auch konfigurierbar. Sie können sie leicht filtern, an Dateien senden, formatieren, Zeitstempel hinzufügen und alles, was Sie auf globaler Ebene benötigen. Druckanweisungen sind nicht einfach zu verwalten.

18
rid

Print-Anweisungen sind eine Art schlechteste von beiden Welten, die die negativen Aspekte eines Online-Debuggers mit diagnostischen Instrumenten kombinieren. Sie müssen das Programm ändern, aber Sie erhalten nicht mehr nützlicher Code.

Mit einem Online-Debugger können Sie den Status eines laufenden Programms überprüfen. Das Schöne an einem echten Debugger ist jedoch, dass Sie die Quelle nicht ändern müssen. weder vor noch nach der Debugging-Sitzung; Sie laden das Programm einfach in den Debugger, teilen dem Debugger mit, wohin Sie schauen möchten, und Sie sind fertig.

Die Instrumentierung der Anwendung kann einige Zeit in Anspruch nehmen und den Quellcode auf irgendeine Weise modifizieren, aber die daraus resultierende Diagnoseausgabe kann enorme Mengen an Details enthalten und bis zu einem bestimmten Grad ein- oder ausgeschaltet werden. Das Python-Protokollierungsmodul kann nicht nur die protokollierte Nachricht anzeigen, sondern auch die Datei und Funktion, die es aufgerufen hat, ein Traceback (falls vorhanden), die tatsächliche Uhrzeit, zu der die Nachricht gesendet wurde, usw. Mehr als das; Diagnoseinstrumente müssen niemals entfernt werden; Es ist genauso gültig und nützlich, wenn das Programm fertig ist und in Produktion ist, als an dem Tag, an dem es hinzugefügt wurde. Es kann jedoch sein, dass die Ausgabe in einer Protokolldatei hängen bleibt, wo es wahrscheinlich niemanden stört, oder die Protokollebene kann deaktiviert werden, um alle Nachrichten außer den dringendsten Nachrichten fernzuhalten.

das Vorhersehen der Notwendigkeit oder Verwendung eines Debuggers ist wirklich nicht schwieriger als die Verwendung von ipython, während Sie testen, und sich mit den Befehlen vertraut machen, die zum Steuern des integrierten pdb-Debuggers verwendet werden. 

Wenn Sie der Meinung sind, dass eine Druckanweisung möglicherweise einfacher ist als pdb (wie häufig), werden Sie feststellen, dass die Verwendung eines Loggers Ihr Programm viel einfacher zu bearbeiten macht, als wenn Sie Druckanweisungen verwenden und später entfernen .

Ich habe meinen Editor so konfiguriert, dass Druckanweisungen als Syntaxfehler und Protokollierungsanweisungen als Kommentare hervorgehoben werden, da ich sie so sehe.

Wenn Sie die Protokollierung verwenden, kann die für die Bereitstellung verantwortliche Person die Protokollierung so konfigurieren, dass sie mit benutzerdefinierten Informationen an einen benutzerdefinierten Speicherort gesendet wird. Wenn Sie nur drucken, dann bekommen sie das alles.

Die Protokollierung erstellt im Wesentlichen eine durchsuchbare Klartextdatenbank für Druckausgaben mit anderen Metadaten (Zeitstempel, Loglevel, Zeilennummer, Prozess usw.).

Dies ist reines Gold, ich kann egrep über die Logdatei laufen lassen after das Python-Skript ist ausgeführt .. __ Ich kann meine egrep-Mustersuche einstellen, um genau das auszuwählen, was mich interessiert, und den Rest zu ignorieren. Diese Verringerung der kognitiven Belastung und die Freiheit, mein Egrep-Muster später durch Ausprobieren herauszufinden, ist für mich der entscheidende Vorteil. 

tail -f mylogfile.log | egrep "key_Word1|key_Word2"

Fügen Sie jetzt andere coole Dinge hinzu, die der Drucker nicht ausführen kann (Senden an Socket, Einstellen der Debug-Levels, Logrotate, Hinzufügen von Metadaten usw.). Sie haben allen Grund, die Protokollierung gegenüber einfachen Druckanweisungen zu bevorzugen.

Ich neige dazu, print-Anweisungen zu verwenden, weil es faul und einfach ist, zum Hinzufügen von Protokollierung etwas Boiler-Platten-Code zu verwenden.

0
ticktock