我一直在玩一个自定义的记录器类,该类是我创建的,以便实现另一个“详细级别”(跟踪)。 我知道,根据logger类的文档不建议这样做-但是我有代码,为了进行广泛的调试,必须有代码。 那只蜜蜂说,我可以按预期使用所有方法(LOG.warning,LOG.trace等)调用记录器,但是当我尝试在另一个类中执行此操作时,它无法按预期运行。我猜记录器的属性由于某种原因而丢失了。
我基本上想要实现的是,我最初设置的属性(如日志格式,日志处理程序,日志级别等)保留在每个类中。
我有一个记录器类,它实现了“ TRACE”:
from logging import getLoggerClass, addLevelName, setLoggerClass, NOTSET
class AioLogger(getLoggerClass()) :
TRACE = 1
def __init__(self, name, level=NOTSET):
super().__init__(name, level)
addLevelName(TRACE, "TRACE")
def trace(self, message, *args, **kwargs):
if self.isEnabledFor(AioLogger.TRACE):
self._log(AioLogger.TRACE, message, args, **kwargs)
setLoggerClass(AioLogger)
a类:
import logging
from AioLogger import AioLogger
from b import b
LOG = AioLogger(logging.getLogger('myapp'))
class a:
def __init__(self):
LOG.setLevel(AioLogger.TRACE)
# create a file handler
file_handler = logging.FileHandler('test.log')
file_handler.setLevel(logging.DEBUG)
file_formatter = logging.Formatter('[%(asctime)s] %(filename)-15s: line %(lineno)-5d: %(levelname)-8s: '
'%(funcName)-50s: %(message)s')
file_handler.setFormatter(file_formatter)
LOG.addHandler(file_handler)
# create console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(AioLogger.TRACE)
console_formatter = logging.Formatter('[%(asctime)s] %(filename)-15s: line %(lineno)-5d: %(levelname)-8s: '
'%(funcName)-50s: %(message)s')
console_handler.setFormatter(console_formatter)
LOG.addHandler(console_handler)
LOG.trace('trace')
LOG.debug('debug')
LOG.info('info')
LOG.warning('warning')
LOG.error('error')
b类:
import logging
from AioLogger import AioLogger
LOG = AioLogger(logging.getLogger('myapp'))
class b:
def __init__(self):
LOG.trace('trace')
LOG.debug('debug')
LOG.info('info')
LOG.warning('warning')
LOG.error('error')
在文件a的末尾添加以下内容:
ls = a()
cls2 = b()
并运行它,将产生以下输出:
[2019-05-05 18:03:19,908] a.py : line 27 : TRACE : __init__ : trace
[2019-05-05 18:03:19,908] a.py : line 28 : DEBUG : __init__ : debug
[2019-05-05 18:03:19,908] a.py : line 29 : INFO : __init__ : info
[2019-05-05 18:03:19,908] a.py : line 30 : WARNING : __init__ : warning
[2019-05-05 18:03:19,908] a.py : line 31 : ERROR : __init__ : error
warning
error
由于某些原因,自定义记录器类的定义属性刚刚消失。我猜错误是在我的自定义记录器类中的某个地方,因为通过logging.getlogger('myapp')获取“默认”记录器的效果很好-但它没有提供所需的TRACE日志级别(因此,自定义记录器类,顺便说一句我在stackoverflow上找到了某个地方。