Ich kombiniere alle vorhandenen Antworten mit einer Reihe von Nutzungserfahrungen und denke, ich habe eine Liste aller Dinge erstellt, die getan werden müssen, um eine vollständig nahtlose Nutzung der neuen Ebene sicherzustellen. Bei den folgenden Schritten wird davon ausgegangen, dass Sie eine neue Ebene TRACE
mit Wert hinzufügen logging.DEBUG - 5 == 5
:
logging.addLevelName(logging.DEBUG - 5, 'TRACE')
muss aufgerufen werden, um die neue Ebene intern zu registrieren, damit sie namentlich referenziert werden kann.
- Die neue Ebene muss aus
logging
Gründen der Konsistenz als Attribut hinzugefügt werden : logging.TRACE = logging.DEBUG - 5
.
- Dem Modul
trace
muss eine aufgerufene Methode hinzugefügt logging
werden. Es sollte verhalten sich wie debug
, info
usw.
- Eine aufgerufene Methode
trace
muss der aktuell konfigurierten Logger-Klasse hinzugefügt werden. Da dies nicht zu 100% garantiert ist logging.Logger
, verwenden Sie logging.getLoggerClass()
stattdessen.
Alle Schritte sind in der folgenden Methode dargestellt:
def addLoggingLevel(levelName, levelNum, methodName=None):
"""
Comprehensively adds a new logging level to the `logging` module and the
currently configured logging class.
`levelName` becomes an attribute of the `logging` module with the value
`levelNum`. `methodName` becomes a convenience method for both `logging`
itself and the class returned by `logging.getLoggerClass()` (usually just
`logging.Logger`). If `methodName` is not specified, `levelName.lower()` is
used.
To avoid accidental clobberings of existing attributes, this method will
raise an `AttributeError` if the level name is already an attribute of the
`logging` module or if the method name is already present
Example
-------
>>> addLoggingLevel('TRACE', logging.DEBUG - 5)
>>> logging.getLogger(__name__).setLevel("TRACE")
>>> logging.getLogger(__name__).trace('that worked')
>>> logging.trace('so did this')
>>> logging.TRACE
5
"""
if not methodName:
methodName = levelName.lower()
if hasattr(logging, levelName):
raise AttributeError('{} already defined in logging module'.format(levelName))
if hasattr(logging, methodName):
raise AttributeError('{} already defined in logging module'.format(methodName))
if hasattr(logging.getLoggerClass(), methodName):
raise AttributeError('{} already defined in logger class'.format(methodName))
# This method was inspired by the answers to Stack Overflow post
# http://stackoverflow.com/q/2183233/2988730, especially
# http://stackoverflow.com/a/13638084/2988730
def logForLevel(self, message, *args, **kwargs):
if self.isEnabledFor(levelNum):
self._log(levelNum, message, args, **kwargs)
def logToRoot(message, *args, **kwargs):
logging.log(levelNum, message, *args, **kwargs)
logging.addLevelName(levelNum, levelName)
setattr(logging, levelName, levelNum)
setattr(logging.getLoggerClass(), methodName, logForLevel)
setattr(logging, methodName, logToRoot)