Last active
September 12, 2021 00:34
-
-
Save mzpqnxow/7e7122c1ed0e6d157dc6cac06ae82e39 to your computer and use it in GitHub Desktop.
Comprehensive example of adding a loglevel to Python logging module
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
Taken from StackOverflow | |
This is the cleanest, most correct and thorough method I've seen | |
""" | |
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 | |
Quick reminder: | |
CRITICAL=50,ERROR=40,WARNING=30,INFO=20,DEBUG=10,NOTSET=0 | |
When you set a log level, you are saying emit events for log | |
levels that are greater than that value. Keep that in mind. | |
""" | |
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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment