Ich verwende das Protokollierungsmodul von Python, um einige Debug-Zeichenfolgen in einer Datei zu protokollieren, die ziemlich gut funktioniert. Außerdem möchte ich dieses Modul jetzt verwenden, um auch die Zeichenfolgen in stdout auszudrucken. Wie mache ich das? Um meine Zeichenfolgen in einer Datei zu protokollieren, verwende ich folgenden Code:
import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
und rufen Sie dann eine Logger-Funktion wie auf
logger.debug("I am written to the file")
Vielen Dank für etwas Hilfe hier!
StreamHandler
mitsys.stdout
, und dann wird es statt stderr dass loggen sein .import sys
zuerst. Und tatsächlich initialisieren Sie den Handler, dhconsoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
wenn Sie versuchen, Informationen zu sehen oder Nachrichten zu debuggenlogging.basicConfig()
kannhandlers
seit Python 3.3 ein Schlüsselwortargument annehmen , was die Einrichtung der Protokollierung erheblich vereinfacht, insbesondere wenn mehrere Handler mit demselben Formatierer eingerichtet werden:Das gesamte Setup kann daher mit einem einzigen Aufruf wie folgt durchgeführt werden:
(Oder mit
import sys
+StreamHandler(sys.stdout)
gemäß den Anforderungen der ursprünglichen Frage - der Standard für StreamHandler ist das Schreiben in stderr. Sehen Sie sich die LogRecord-Attribute an, wenn Sie das Protokollformat anpassen und Dinge wie Dateiname / Zeile, Thread-Informationen usw. hinzufügen möchten.)Das obige Setup muss nur einmal am Anfang des Skripts durchgeführt werden. Sie können die Protokollierung von allen anderen Stellen in der Codebasis später wie folgt verwenden:
Hinweis: Wenn es nicht funktioniert, hat wahrscheinlich bereits jemand anderes das Protokollierungssystem anders initialisiert. Kommentare empfehlen,
logging.root.handlers = []
vor dem Anruf zu tunbasicConfig()
.quelle
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Dies bedeutet, dass Sie nur verwenden können, wenn Sie sich nur im selben Ordner anmelden möchtenFileHandler("mylog.log")
. Wenn Sie das Protokoll jedes Mal überschreiben möchten, setzen Sie "w" als zweites Argument.logging.root.handlers = []
vor dem Aufruf vonbasicConfig
die Funktion an - es ist ärgerlich.Das Hinzufügen eines StreamHandlers ohne Argumente erfolgt an stderr anstelle von stdout. Wenn ein anderer Prozess vom stdout-Speicherauszug abhängig ist (dh beim Schreiben eines NRPE-Plugins), müssen Sie stdout explizit angeben, da sonst unerwartete Probleme auftreten können.
Hier ist ein kurzes Beispiel für die Wiederverwendung der angenommenen Werte und LOGFILE aus der Frage:
quelle
Entweder laufen
basicConfig
mitstream=sys.stdout
vor als Argument dem Einrichten eines Handler oder alle Nachrichten Anmeldung oder manuell hinzufügen ein ,StreamHandler
dass Schübe Nachrichten an stdout an die Wurzel Logger (oder einem anderen Logger Sie wollen, für diese Angelegenheit).quelle
Nachdem ich Waterboys Code in mehreren Python-Paketen immer wieder verwendet habe, habe ich ihn schließlich in ein winziges eigenständiges Python-Paket umgewandelt, das Sie hier finden:
https://github.com/acschaefer/duallog
Der Code ist gut dokumentiert und einfach zu bedienen. Laden Sie einfach die
.py
Datei herunter und fügen Sie sie in Ihr Projekt ein oder installieren Sie das gesamte Paket überpip install duallog
.quelle
Protokollierung in
stdout
undrotating file
mit verschiedenen Ebenen und Formaten:quelle
Hier ist eine vollständige, gut verpackte Lösung, die auf Waterboys Antwort und verschiedenen anderen Quellen basiert . Es unterstützt die Protokollierung sowohl in der Konsole als auch in der Protokolldatei, ermöglicht unterschiedliche Einstellungen für die Protokollebene, bietet eine farbige Ausgabe und ist einfach zu konfigurieren (auch als Gist verfügbar ):
quelle
Versuchen Sie für 2.7 Folgendes:
quelle