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.
print
.print
besteht, Hilfemeldungen für den Benutzer in einer Befehlszeilenanwendung anzuzeigen.Antworten:
Das Protokollierungspaket bietet viele nützliche Funktionen:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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?
quelle