Bei der Python-Protokollierung gibt es zwei verschiedene Konzepte: die Ebene, auf der sich der Logger anmeldet, und die Ebene, die der Handler tatsächlich aktiviert.
Wenn ein Anruf gemacht zu protokollieren, was im Grunde geschieht, ist:
if self.level <= loglevel:
for handler in self.handlers:
handler(loglevel, message)
Während jeder dieses Handler ruft dann:
if self.level <= loglevel:
# do something spiffy with the log!
Wenn Sie eine reale Welt mögen Demonstration von diesem können Sie Django's config settings betrachten. Ich werde den entsprechenden Code hier einfügen.
LOGGING = {
#snip
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['special']
}
},
'loggers': {
#snip
'myproject.custom': {
# notice how there are two handlers here!
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}
also in der obigen Konfiguration, protokolliert nur getLogger('myproject.custom').info
und oben wird für die Protokollierung verarbeitet bekommen. Wenn dies geschieht, gibt die Konsole alle Ergebnisse aus (sie gibt alles aus, weil sie auf DEBUG
gesetzt ist), während der mail_admins
Logger für alle s, FATAL
s und CRITICAL
s auftritt.
Ich nehme an, einige Code, die auch helfen könnte nicht Django ist:
import logging.handlers as hand
import logging as logging
# to make things easier, we'll name all of the logs by the levels
fatal = logging.getLogger('fatal')
warning = logging.getLogger('warning')
info = logging.getLogger('info')
fatal.setLevel(logging.FATAL)
warning.setLevel(logging.WARNING)
info.setLevel(logging.INFO)
fileHandler = hand.RotatingFileHandler('rotating.log')
# notice all three are re-using the same handler.
fatal.addHandler(fileHandler)
warning.addHandler(fileHandler)
info.addHandler(fileHandler)
# the handler should log everything except logging.NOTSET
fileHandler.setLevel(logging.DEBUG)
for logger in [fatal,warning,info]:
for level in ['debug','info','warning','error','fatal']:
method = getattr(logger,level)
method("Debug " + logger.name + " = " + level)
# now, the handler will only do anything for *fatal* messages...
fileHandler.setLevel(logging.FATAL)
for logger in [fatal,warning,info]:
for level in ['debug','info','warning','error','fatal']:
method = getattr(logger,level)
method("Fatal " + logger.name + " = " + level)
Das ergibt:
Debug fatal = fatal
Debug warning = warning
Debug warning = error
Debug warning = fatal
Debug info = info
Debug info = warning
Debug info = error
Debug info = fatal
Fatal fatal = fatal
Fatal warning = fatal
Fatal info = fatal
Auch hier bemerken, wie info
etwas bei info
angemeldet, warning
, error
und fatal
wenn der Log-Handler auf DEBUG
eingestellt war, aber als der Handler auf FATAL
gesetzt wurde, wurden plötzlich nur FATAL
Nachrichten t o die Datei.
Gute Frage, aber aus Gründen der Kohärenz, wenn Sie testen 'a.getEffectiveLevel',' a.setLevel' macht mehr Sinn als 'h.setLevel'. –
In diesem Fall hat der Handler keinen 'getEffectiveLevel'-Befehl. –