Ich habe ein Projekt, in dem die zugrunde liegenden Tools protokolliert werden, und ich protokolliere auch (mit verschiedenen Logger-Instanzen).
Manchmal macht der Logger, auf den ich keinen Zugriff habe, Informationen verfügbar, die ich aus dem Protokoll entfernen (oder durch einen Platzhalter ersetzen möchte).
Gibt es eine Möglichkeit, einen Filter zu verwenden, um dies für alle Python-Logger in einem Projekt zu tun ?
Hier ist meine Protokollierungskonfiguration in Django:
LOGGING_CONFIG = None
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"my_formatter": {
"format": "[%(asctime)s] %(message)s",
"datefmt": "%d/%b/%Y %H:%M:%S",
},
},
"handlers": {
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "my_formatter",
},
},
"loggers": {
"my_logger": {
"handlers": ["console"],
"level": "DEBUG"
},
},
}
logging.config.dictConfig(LOGGING)
Mein Endziel ist es, zu verhindern, dass bestimmte Dinge in Protokollen auftauchen, indem ich sie ersetze. Wenn es eine andere Möglichkeit gibt, können Sie sie gerne teilen.
Vielen Dank!
Antworten:
Wenn Ihr Hauptziel darin besteht, vertrauliche Daten zu filtern, lesen Sie Ausblenden vertraulicher Daten aus Protokollen mit Python . Sie können entweder a implementieren
logging.Filter
, um die Protokollierung einiger Datensätze zu verhindern, oder a implementierenloggingFormatter
, um nur die Teile bestimmter Datensätze mit einem regulären Ausdruck zu reduzieren.Um die Filter- und Formatierungsklassen auf alle Logger anzuwenden, definieren Sie sie in der dict-Konfiguration und fügen Sie sie zu allen vorhandenen Handlern hinzu. Ziehen Sie auch in Betracht, unbeschriebene Handler durch Festlegen zu entfernen
disable_existing_loggers': True
. Beispiele für benutzerdefinierte Formatierer und Filter finden Sie in den Django-Protokollierungsdokumenten .quelle
Ob Sie es glauben oder nicht, Sie haben Zugriff auf die Logger der zugrunde liegenden Projekte! Da Sie sich in Django befinden, können Ihre Einstellungen geladen und die Protokollierung initialisiert werden, bevor die Protokollierer dieser zugrunde liegenden Projekte instanziiert werden.
Dies ist ein zweistufiger Prozess. Der erste Schritt besteht darin, den Logger zu identifizieren, der die Quelle der Nachricht ist, die Sie unterdrücken möchten. Um dies zu tun, fügen Sie
name
anmy_formatter
:Sobald wir den Namen gefunden haben, können wir unseren Filter definieren.
Und jetzt, da Sie den Namen des Loggers kennen, der die fehlerhafte Nachricht erzeugt, können wir unsere
AwesomeFilter
an den Logger anhängen :Wir verwenden den Trick, den Namen des Loggers zu finden, um die Ausgabe der Protokollierung für Bibliotheken von Drittanbietern ziemlich häufig zu steuern. Viel Glück!
quelle
Wenn Sie dieselbe Protokollierungskonfiguration an alle Mitarbeiter in Ihrem Projekt weitergeben möchten, empfehle ich, eine Protokollierungsdatei in Ihren Dienstprogrammen zu erstellen und diese dann überall zu importieren, um sie stattdessen zu verwenden
import logging
Wenn Sie sicherstellen möchten, dass Ihre Konfiguration nicht mit anderen Handlern in Konflikt steht , können Sie wie folgt vorgehen
Datei utils / log.py.
Importieren Sie dann einfach diesen Logger in alle Ihre Mitarbeiter, anstatt die Bibliothek zu protokollieren
quelle