Ich verwende das Python-Protokollierungsmodul und möchte Protokollnachrichten deaktivieren, die von den von mir importierten Drittanbieter-Modulen gedruckt werden. Zum Beispiel verwende ich so etwas wie das Folgende:
logger = logging.getLogger()
logger.setLevel(level=logging.DEBUG)
fh = logging.StreamHandler()
fh_formatter = logging.Formatter('%(asctime)s %(levelname)s %(lineno)d:%(filename)s(%(process)d) - %(message)s')
fh.setFormatter(fh_formatter)
logger.addHandler(fh)
Dadurch werden meine Debug-Meldungen ausgedruckt, wenn ich einen logger.debug ("meine Nachricht!") Ausführe, aber es werden auch die Debug-Meldungen von jedem Modul ausgedruckt, das ich importiere (z. B. Anforderungen und eine Reihe anderer Dinge).
Ich möchte nur die Protokollnachrichten von Modulen sehen, an denen ich interessiert bin. Ist es möglich, dass das Protokollierungsmodul dies tut?
Im Idealfall möchte ich den Logger anweisen können, Nachrichten von "ModuleX, ModuleY" zu drucken und alle anderen zu ignorieren.
Ich habe mir Folgendes angesehen, möchte aber nicht vor jedem Aufruf einer importierten Funktion die Protokollierung deaktivieren / aktivieren müssen: Protokollierung - Wie werden importierte Modulprotokolle ignoriert?
__name__
r, sehe aber immer noch die Protokolle der importierten Module. Ich versuche, die Protokollierung mit einer INI-Konfigurationsdatei zu konfigurieren. Was soll ich dafür tun?__name__
hat bei mir auch nicht funktioniert. Vielleicht, weil ich ein eigenständiges Skript und kein "Modul" verwende? Für mich hat es funktioniert, die Protokollierung für importierte Module (matpplotlib
in meinem Fall) überlogging.getLogger("matplotlib").setLevel(logging.WARNING)
und für mein Skript über zu konfigurierenlogging.basicConfig
.Wenn Sie das Python-
logging
Paket verwenden, ist es üblich, in jedem Modul, das es verwendet, einen Logger zu definieren.Viele beliebte Python-Pakete tun dies, einschließlich
requests
. Wenn ein Paket diese Konvention verwendet, ist es einfach, die Protokollierung für dieses Paket zu aktivieren / deaktivieren, da der Name des Protokollierers mit dem Namen des Pakets identisch ist (oder ein untergeordnetes Element dieses Protokollierers ist). Sie können es sogar in derselben Datei wie Ihre anderen Logger protokollieren.quelle
logging.basicConfig(...)
allen Loggern zu konfigurieren, entweder entwederlogging.lastResort
(beginnend mit Python 3.2, das ist stderr) ausgegeben wird, wenn kein Handler angegeben wurde, oder an den von Ihnen festgelegten Handler. Verwenden Sie es also nicht, sonst erhalten Sie trotzdem weiterhin alle Protokollnachrichten.Ich bin mir nicht sicher, ob dies zum Posten geeignet ist, aber ich war lange festgefahren und wollte jemandem mit dem gleichen Problem helfen, da ich es nirgendwo anders gefunden hatte!
Ich habe Debug-Protokolle von matplotlib erhalten, obwohl ich der recht einfachen Dokumentation im erweiterten Tutorial zur Protokollierung und der Fehlerbehebung gefolgt bin . Ich habe meinen Logger
main()
für eine Datei initiiert und eine Funktion importiert, um ein Diagramm aus einer anderen Datei zu erstellen (in die ich matplotlib importiert hatte).Was für mich funktioniert hat, war, die Ebene von matplotlib vor dem Importieren festzulegen , anstatt danach, wie ich es für andere Module in meiner Hauptdatei getan habe. Dies schien mir nicht intuitiv zu sein. Wenn also jemand einen Einblick hat, wie Sie die Konfiguration für einen Logger festlegen können, der noch nicht importiert wurde, wäre ich gespannt, wie dies funktioniert. Vielen Dank!
In meiner Hauptdatei:
In meiner
plot.py
Datei:quelle
logger.DEBUG
sollte seinlogging.DEBUG
@ Bakuriu erklärt ganz elegant die Funktion. Umgekehrt können Sie die
getLogger()
Methode verwenden, um unerwünschte Logger abzurufen und neu zu konfigurieren / zu deaktivieren.Ich wollte auch hinzufügen, dass die
logging.fileConfig()
Methode einen aufgerufenen Parameter akzeptiertdisable_existing_loggers
, der alle zuvor definierten Logger deaktiviert (dh in importierten Modulen).quelle
Dadurch werden alle vorhandenen Protokollierer deaktiviert, z. B. diejenigen, die von importierten Modulen erstellt wurden, während der Root-Protokollierer weiterhin verwendet wird (und ohne dass eine externe Datei geladen werden muss).
Beachten Sie, dass Sie alle Module importieren müssen, die nicht zuerst protokolliert werden sollen! Andernfalls werden diese nicht als "vorhandene Logger" betrachtet. Anschließend werden alle Logger dieser Module deaktiviert. Dies kann dazu führen, dass Sie auch wichtige Fehler verpassen!
Ausführlichere Beispiele für verwandte Konfigurationsoptionen finden Sie unter https://gist.github.com/st4lk/6287746 . Hier ist ein (teilweise funktionierendes) Beispiel für die Konfiguration von YAML mit der
coloredlog
Bibliothek.quelle
request
Beispiel, aber es funktioniert nicht, wenn die importierten Module ihre Logger in ihrer Klasse erstellen, die Sie später aufrufen würden, wieAPScheduler
dies beim Aufrufen der Fall istBackgroundScheduler.BackgroundScheduler()
. Eine Lösung finden Sie hier: stackoverflow.com/a/48891485/2441026Sie könnten etwas verwenden wie:
Dadurch wird die Protokollstufe meines eigenen Moduls auf DEBUG gesetzt, während verhindert wird, dass das importierte Modul dieselbe Stufe verwendet.
Hinweis:
"imported_module"
Kann durchimported_module.__name__
(ohne Anführungszeichen) ersetzt werden und"my_own_logger_name"
kann durch ersetzt werden,__name__
wenn Sie dies bevorzugen.quelle
Ich hatte das gleiche Problem. Ich habe eine logging_config.py-Datei, die ich in alle anderen py-Dateien importiere. In der Datei logging_config.py habe ich die Protokollierungsstufe des Root-Loggers auf ERROR gesetzt (standardmäßig die Warnung):
In anderen Modulen importiere ich logging_config.py und deklariere einen neuen Logger und setze dessen Level auf Debug:
Auf diese Weise wird alles protokolliert, was ich in meinen py-Dateien anmelde, aber auf Debug- und Info-Ebene von importierten Modulen wie urllib, request, boto3 usw. protokollierte Inhalte werden nicht protokolliert. Wenn in diesem Importmodul ein Fehler auftritt, wird es protokolliert, da ich die Root-Logger-Ebene auf ERROR gesetzt habe.
quelle
Eine weitere zu berücksichtigende Sache ist die Propagate- Eigenschaft der Logger-Klasse.
Zum Beispiel eine py-suds-Bibliothek zur Bearbeitung von Seifenanrufen, die sogar auf ERROR gestellt wird
protokolliert Protokolle über ein Modul namens sxbasics.py, das eine große Anzahl von Protokollen erstellt
Da die Weitergabe der Protokolle standardmäßig True ist und stattdessen auf False gesetzt wurde, habe ich 514 MB Protokolle wiederhergestellt.
quelle