Ich verwende das Protokollierungsmodul von Python und möchte die Konsolenprotokollierung für einige Zeit deaktivieren, aber es funktioniert nicht.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
Der obige Code zeigt das bla bla
on stdout an und ich weiß nicht, wie ich den Konsolenhandler sicher deaktivieren kann. Wie kann ich sicher sein, dass ich den StreamHandler der Konsole vorübergehend entferne und keinen anderen?
logger.handlers
leer sein (wie vor demlogger.debug()
Anruf). Der betreffende Code wird nur angezeigt[]
(leere Liste der Handler). Verifiziert mit Python 2.7.15 und Python 3.6.6.Antworten:
Ich habe eine Lösung dafür gefunden:
Dadurch wird verhindert, dass die Protokollierung an den oberen Protokollierer gesendet wird, der die Konsolenprotokollierung enthält.
quelle
INFO
Nachrichten), können Sie die zweite Zeile etwas wie ändernlogger.setLevel(logging.WARNING)
logging.lastResort
protokolliert der Handler auch Nachrichten mit Schweregradlogging.WARNING
und höher,sys.stderr
wenn keine anderen Handler vorhanden sind. Siehe meine Antwort .Ich benutze:
quelle
logging
Modulebene zur Deaktivierung der Protokollierung vollständig , zum Beispiel:import logging; logging.disable(logging.CRITICAL);
: docs.python.org/2/library/logging.html#logging.disabledisabled
Attribut ist nicht Teil der öffentlichen API. Siehe bugs.python.org/issue36318 .Sie können verwenden:
wo your_level einer von denen ist:
Wenn Sie also your_level auf logging.CRITICAL setzen , erhalten Sie nur kritische Nachrichten, die gesendet werden von:
Wenn Sie your_level auf logging.DEBUG setzen, werden alle Protokollierungsstufen angezeigt .
Weitere Informationen finden Sie in den Protokollierungsbeispielen.
Verwenden Sie auf die gleiche Weise die Funktion Handler.setLevel () , um die Ebene für jeden Handler zu ändern .
quelle
(lange tote Frage, aber für zukünftige Suchende)
Näher am Code / der Absicht des Originalplakats funktioniert dies für mich unter Python 2.6
Das Problem, das ich lösen musste, war, den Standard-Handler zu entfernen, nachdem ich einen neuen hinzugefügt hatte. Der Logger-Code scheint die Standardausgabe automatisch neu hinzuzufügen, wenn keine Handler vorhanden sind.
quelle
logger = logging.getLogger(); lhStdout = logger.handlers[0]
ist falsch, da der Root-Logger zunächst keine Handler hat -python -c "import logging; assert not logging.getLogger().handlers"
. Verifiziert mit Python 2.7.15 und Python 3.6.6.Kontextmanager
Anwendungsbeispiel:
quelle
So deaktivieren Sie die Protokollierung vollständig :
So aktivieren Sie die Protokollierung :
Andere Antworten bieten Problemumgehungen, die das Problem nicht vollständig lösen, wie z
und für einige
n
größer als 50,Das Problem mit der ersten Lösung ist, dass es nur für den Root-Logger funktioniert. Andere Logger, die beispielsweise mit erstellt wurden,
logging.getLogger(__name__)
werden mit dieser Methode nicht deaktiviert.Die zweite Lösung betrifft alle Protokolle. Die Ausgabe wird jedoch auf Werte über dem angegebenen Wert begrenzt, sodass sie durch Protokollieren mit einem Wert über 50 überschrieben werden kann.
Das kann verhindert werden durch
Soweit ich das beurteilen kann (nach Überprüfung der Quelle ), ist dies die einzige Möglichkeit, die Protokollierung vollständig zu deaktivieren.
quelle
Hier gibt es einige wirklich nette Antworten, aber anscheinend wird die einfachste nicht zu sehr berücksichtigt (nur von infinito).
Dadurch wird der Root-Logger und damit alle anderen Logger deaktiviert. Ich habe nicht wirklich getestet, aber es sollte auch das schnellste sein.
Aus dem Protokollcode in Python 2.7 sehe ich dies
Das heißt, wenn es deaktiviert ist, wird kein Handler aufgerufen, und es sollte effizienter sein, als beispielsweise auf einen sehr hohen Wert zu filtern oder einen No-Op-Handler festzulegen.
quelle
log = logging.getLogger(__name__)
disabled
Attribut ist nicht Teil der öffentlichen API. Siehe bugs.python.org/issue36318 .Keine Notwendigkeit, stdout umzuleiten. Hier ist ein besserer Weg, dies zu tun:
Ein noch einfacherer Weg ist:
quelle
logging.basicConfig()
Funktionsbeschreibung (Hervorhebung von mir) gesehen werden: Führt die Grundkonfiguration für das Protokollierungssystem durch, indem ein StreamHandler mit einem Standardformatierer erstellt und dem Root-Logger hinzugefügt wird. Die Funktionen debug (), info (), warning (), error () und Critical () rufen basicConfig () automatisch auf, wenn für den Root-Logger keine Handler definiert sind . - docs.python.org/3/library/logging.html#logging.basicConfigIch kenne das Protokollierungsmodul nicht sehr gut, aber ich verwende es so, dass ich normalerweise nur Debug- (oder Info-) Nachrichten deaktivieren möchte. Mit können Sie
Handler.setLevel()
die Protokollierungsstufe auf KRITISCH oder höher einstellen.Sie können auch sys.stderr und sys.stdout durch eine zum Schreiben geöffnete Datei ersetzen. Siehe http://docs.python.org/library/sys.html#sys. stdout . Aber das würde ich nicht empfehlen.
quelle
[]
.Du könntest auch:
quelle
app.logger
die Sie nicht einmal angeben, anstelle des in der Frage (logging.getLogger()
) und den meisten Antworten explizit erwähnten Root-Loggers ? Woher wissen Sie, dass Siehandlers
Eigenschaften sicher ändern können, anstatt dieLogger.addHandler
Methode aufzurufen ?Konsolenausgabe:
Inhalt der Datei test.log:
quelle
Durch Ändern einer Ebene in "logging.config.dictConfig" können Sie die gesamte Protokollierungsstufe auf eine neue Ebene bringen.
})
quelle
Mit Dekoratoren eine elegante Lösung gefunden , die das folgende Problem behebt: Was ist, wenn Sie ein Modul mit mehreren Funktionen schreiben, von denen jede mehrere Debugging-Meldungen enthält, und die Anmeldung aller Funktionen außer der, auf die Sie sich gerade konzentrieren, deaktivieren möchten?
Sie können es mit Dekorateuren tun:
Dann können Sie Folgendes tun:
Auch wenn Sie
function_already_debugged
von innen anrufenfunction_being_focused
, debuggen Sie Nachrichten vonfunction_already_debugged
nicht angezeigt. Dadurch wird sichergestellt, dass nur die Debug-Meldungen der Funktion angezeigt werden, auf die Sie sich konzentrieren.Ich hoffe es hilft!
quelle
Wenn Sie einen bestimmten Logger vorübergehend deaktivieren möchten, tun Sie Folgendes.
Beispielprotokoll
Code
quelle
In der Protokollierungs-Python-Bibliothek können Sie die Protokollierung (für alle Ebenen) für einen bestimmten Protokollierer vollständig deaktivieren, indem Sie einen der folgenden Schritte ausführen:
Das Hinzufügen der Logger ein
logging.NullHandler()
Handler (verhindern , dass dielogging.lastResort
Behandlungsroutine von Ereignissen Schwerer Protokollierunglogging.WARNING
und größersys.stderr
) und Einstellen despropagate
Attributs des LoggerFalse
(Logger zu verhindern , Leiten der Ereignisse an die Behandlungsroutinen des seinem Vorfahren Loggern).Verwenden der Haupt-API:
Verwenden der Konfigurations-API:
Hinzufügen eines
lambda record: False
Filters zum Logger .Verwenden der Haupt-API:
Verwenden der Konfigurations-API:
Warnung. - Im Gegensatz zur ersten Lösung deaktiviert die zweite Lösung die Protokollierung von untergeordneten Protokollierern nicht (z. B.)
logging.getLogger("foo.bar")
) sollte sie nur zum Deaktivieren der Protokollierung für einen einzelnen Protokollierer verwendet werden.Hinweis. - Das Festlegen des
disabled
Attributs des Protokollierers aufTrue
ist keine dritte Lösung, da es nicht Teil der öffentlichen API ist. Siehe https://bugs.python.org/issue36318 :quelle
Unterklasse des Handlers, den Sie vorübergehend deaktivieren möchten:
Es ist ganz einfach, den Handler beim Namen zu finden:
einmal gefunden:
quelle