Wie wäre es hier!
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
Verwendung:
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
Wenn Sie zu viele Protokolle von Paketen von Drittanbietern sehen, führen Sie diese Konfiguration unbedingt aus, logging.config.dictConfig(LOGGING_CONFIG)
bevor Sie die Pakete von Drittanbietern importieren.
Referenz: https://docs.python.org/3/library/logging.config.html#configuration-dictionary-schema
root
Loggers: auf der obersten Ebene des Wörterbuchs. Es wird in den Dokumenten beschrieben , hat Vorrang vor dem['loggers']['']
Vorhandensein beider, ist aber meiner Meinung['loggers']['']
nach logischer. Siehe auch Diskussion hier'disable_existing_loggers': False
da Sie dann vielleicht nicht das ganze Tuch konfigurieren, sondern vielleicht etwas wiederverwenden, das bereits vorhanden ist. Wenn Sie es einstellenTrue
, bekomme ich anscheinend keine Ausgabe.format
ab verwendenformatters
?Die akzeptierte Antwort ist nett! Aber was wäre, wenn man mit etwas weniger Komplexem beginnen könnte? Das Protokollierungsmodul ist sehr leistungsfähig und die Dokumentation ist ein bisschen überwältigend, besonders für Anfänger. Zu Beginn müssen Sie jedoch keine Formatierer und Handler konfigurieren. Sie können es hinzufügen, wenn Sie herausfinden, was Sie wollen.
Beispielsweise:
quelle
logging.info('Hello, log')
, das die Dinge für mich zum Klicken brachte. Die Verwirrung in der Dokumentation ist, dass wir mit dictConfig keinegetLogger
dieser Aktionen mehr ausführen müssen .'': { 'level': 'INFO'...
und warum er ohne ihn nicht funktioniert (z. B. wenn Sie den leeren Wert in einen gültigen Wertstandard
getLogger()
wenn Sie mehrere Logger mit unterschiedlichen Namen möchten. Jeder dieser Logger erbt die Konfiguration vom Root-Logger.getLogger
ist immer optional. Wenn Sie dielogging.info()
Methode direkt verwenden, wird der Root-Logger verwendet, währendgetLogger()
Sie verschiedene Logger mit unterschiedlichen Namen und Ebenen verwenden können.Beispiel mit Stream Handler, File Handler, Rotating File Handler und SMTP Handler
quelle
Ich habe unten die Standardkonfiguration für Django v1.11.15 gefunden , hoffe, es hilft
quelle
quelle