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

91

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

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

Sam Odio
quelle
3
Bei großen Projekten ist die Protokollierung immer eine "Best Practice", da Sie sie einfach ein- oder ausschalten und mehr oder weniger Informationen erhalten können. Print bietet keinen dieser Vorteile.
Chris Eberle
3
Ich glaube nicht, dass es jemals einen besten Anwendungsfall für gibt print.
SingleNegationElimination
4
In der Python-Protokollierungsdokumentation wird angegeben, dass der beste Anwendungsfall darin printbesteht, Hilfemeldungen für den Benutzer in einer Befehlszeilenanwendung anzuzeigen.
matschig
Wenn ich all diese Antworten lese, möchte ich die umgekehrte Frage stellen: Gibt es jemals einen Grund, die Protokollierung nicht zu verwenden?
information_interchange

Antworten:

99

Das Protokollierungspaket bietet viele nützliche Funktionen:

  • Leicht zu erkennen, von wo und wann (auch von welcher Leitungsnummer) ein Protokollierungsanruf getätigt wird.
  • Sie können sich gleichzeitig bei Dateien, Sockets und so ziemlich allem anmelden.
  • Sie können Ihre Protokollierung nach Schweregrad unterscheiden.

Print hat keine davon.

Wenn Ihr Projekt von anderen Python-Tools importiert werden soll, ist es für Ihr Paket eine schlechte Praxis, Dinge nach Standard zu drucken, da der Benutzer wahrscheinlich nicht weiß, woher die Drucknachrichten stammen. Mit der Protokollierung können Benutzer Ihres Pakets auswählen, ob sie Protokollierungsnachrichten von Ihrem Tool verbreiten möchten oder nicht.

Ondrej Slinták
quelle
2
Sehr gut gesagt. Ich verwende manchmal print, wenn ich ein Wegwerfskript debugge, das ich genau einmal ausführen möchte, aber jeder Code, der jemals von anderen menschlichen Augen gesehen wurde oder länger als einen Tag dauern soll, wird protokolliert.
TimothyAWiseman
22

Einer der größten Vorteile einer ordnungsgemäßen Protokollierung besteht darin, dass Sie Nachrichten kategorisieren und je nach Bedarf ein- oder ausschalten können. Beispielsweise kann es nützlich sein, Nachrichten auf Debugging-Ebene für einen bestimmten Teil des Projekts zu aktivieren, diese jedoch für andere Teile abzuschwächen, um nicht von einer Informationsüberflutung übernommen zu werden und sich einfach auf die Aufgabe zu konzentrieren, für die Sie sie benötigen Protokollierung.

Außerdem können Protokolle konfiguriert werden. Sie können sie einfach filtern, an Dateien senden, formatieren, Zeitstempel hinzufügen und andere Dinge, die Sie möglicherweise global benötigen. Druckanweisungen sind nicht einfach zu verwalten.

loswerden
quelle
3
Definitiv +1 zum Senden der Ausgabe an Dateien. Das Parsen einer Protokolldatei im Post-Mortem ist viel besser, als sie in einem geöffneten Konsolenfenster erneut beschädigen zu müssen, um den Fehler zu finden. Grundsätzlich ist ein Logger ideal für alle Zeiten, in denen Sie das Skript debuggen müssen, nachdem es fehlgeschlagen ist, und nicht, während es fehlschlägt. Es ist auch ideal, wenn Sie ein komplexes Problem debuggen müssen, bei dem Sie die Programmausgabe analysieren müssen. Grundsätzlich wird ein Logger jedes Mal, wenn Sie mit Fehlern arbeiten, die komplexer sind als Syntaxfehler, dies wahrscheinlich für Sie vereinfachen.
Jonathanb
11

Print-Anweisungen sind die schlimmsten in beiden Welten und kombinieren die negativen Aspekte eines Online-Debuggers mit diagnostischen Instrumenten. Sie müssen das Programm ändern, erhalten aber keinen nützlichen Code mehr .

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 einfach das Programm in den Debugger, teilen dem Debugger mit, wo Sie suchen möchten, und schon sind Sie fertig.

Das Instrumentieren der Anwendung erfordert möglicherweise einige Vorarbeiten und das Ändern des Quellcodes in irgendeiner Weise. Die resultierende Diagnoseausgabe kann jedoch sehr detailliert sein 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 die Funktion, die sie aufgerufen haben, einen Traceback, falls vorhanden, die tatsächliche Zeit, zu der die Nachricht gesendet wurde, und so weiter. Mehr als das; diagnostische Instrumente müssen niemals entfernt werden; Es ist genauso gültig und nützlich, wenn das Programm fertig und in Produktion ist, wie an dem Tag, an dem es hinzugefügt wurde. Die Ausgabe kann jedoch in einer Protokolldatei stecken bleiben, in der es wahrscheinlich niemanden stört, oder die Protokollstufe kann verringert werden, um alle bis auf die dringendsten Nachrichten fernzuhalten.

Es ist nicht schwieriger, die Notwendigkeit oder Verwendung eines Debuggers zu antizipieren, als beim Testen ipython zu verwenden und sich mit den Befehlen vertraut zu machen, mit denen der integrierte pdb-Debugger gesteuert wird.

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

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

SingleNegationElimination
quelle
4

Wenn Sie die Protokollierung verwenden, kann die für die Bereitstellung verantwortliche Person den Protokollierer so konfigurieren, dass er ihn mit benutzerdefinierten Informationen an einen benutzerdefinierten Speicherort sendet. Wenn Sie nur drucken, ist das alles, was sie bekommen.

Ignacio Vazquez-Abrams
quelle
1

Durch die Protokollierung wird im Wesentlichen eine durchsuchbare Nur-Text-Datenbank mit Druckausgaben mit anderen Metadaten (Zeitstempel, Googlevel, Zeilennummer, Prozess usw.) erstellt.

Dies ist reines Gold, ich kann egrep über die Protokolldatei ausführen, nachdem das Python-Skript ausgeführt wurde. Ich kann meine egrep-Mustersuche optimieren, um genau das auszuwählen, woran ich interessiert bin, und den Rest ignorieren. Diese Verringerung der kognitiven Belastung und die Freiheit, mein Egrep-Muster später durch Ausprobieren auszuwählen, ist der Hauptvorteil für mich.

tail -f mylogfile.log | egrep "key_word1|key_word2"

Wenn Sie jetzt andere coole Dinge einwerfen, die der Druck nicht kann (Senden an den Socket, Festlegen von Debug-Levels, Protokollieren, Hinzufügen von Metadaten usw.), haben Sie allen Grund, die Protokollierung gegenüber einfachen Druckanweisungen vorzuziehen.

Ich neige dazu, Druckanweisungen zu verwenden, weil es faul und einfach ist. Das Hinzufügen der Protokollierung erfordert einen Code für die Kesselplatte. Hey, wir haben Yasnippets (Emacs) und Ultisnips (Vim) und andere Vorlagen-Tools. Warum also die Protokollierung für einfache Druckanweisungen aufgeben?

Tick ​​Tack
quelle