Kết hợp tất cả các câu trả lời hiện có với một loạt kinh nghiệm sử dụng, tôi nghĩ rằng tôi đã đưa ra một danh sách tất cả những việc cần phải làm để đảm bảo sử dụng cấp độ mới hoàn toàn liền mạch. Các bước bên dưới giả định rằng bạn đang thêm một cấp độ mới TRACE
với giá trị logging.DEBUG - 5 == 5
:
logging.addLevelName(logging.DEBUG - 5, 'TRACE')
cần được gọi để có được cấp độ mới được đăng ký nội bộ để nó có thể được tham chiếu theo tên.
- Các cấp độ mới cần phải được thêm vào như là một thuộc tính để
logging
bản thân cho phù hợp: logging.TRACE = logging.DEBUG - 5
.
- Một phương thức được gọi
trace
cần được thêm vào logging
mô-đun. Nó nên cư xử giống như debug
, info
vv
- Một phương thức được gọi
trace
cần được thêm vào lớp trình ghi nhật ký hiện được cấu hình. Vì điều này không được đảm bảo 100% logging.Logger
, hãy sử dụng logging.getLoggerClass()
thay thế.
Tất cả các bước được minh họa trong phương pháp dưới đây:
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)