[英]Implementation of Python Logger Class Not Printing Logs
我扩展了下面给出的python记录器类:
class CommonLogger(Logger):
def debug(self, *args):
self.check_and_log(10, args)
def info(self, *args):
self.check_and_log(20, args)
def warn(self, *args):
self.check_and_log(30, args)
def error(self, *args):
self.check_and_log(40, args)
def check_and_log(self, level, args):
if self.isEnabledFor(level):
log_str = self.convert_list_to_string(args)
super().log(level, log_str)
@staticmethod
def convert_list_to_string(args):
return ''.join(str(msg) for msg in args)
然后在每个使用它的类中创建一个记录器,如下所示:
self.logger = CommonLogger(logging.getLogger(Constants.LOGGER_NAME))
self.logger.info('starting logger: ' + str(Constants.LOGGER_NAME))
但是当我运行它时,它不会抛出错误 - 但它也不会在控制台上打印任何日志。 知道为什么吗?
更新:我将其与打印日志的正常流程进行了比较 - 看起来我的logging.handlers在作为 Logger 类的实现创建时并未在 Logger 类中初始化(空列表)。
handlers = {list} <class 'list'> []
在正常流程中 - 处理程序填写如下:
handlers = {list} <class 'list'>: [<StreamHandler <stdout> (INFO)>, <RotatingFileHandler D:\y\logs\engine.log (INFO)>]
0 = {StreamHandler} <StreamHandler <stdout> (INFO)>
1 = {RotatingFileHandler} <RotatingFileHandler D:\y\logs\engine.log (INFO)>
__len__ = {int} 2
有什么建议?
这就是最终解决我的问题的原因:
class Message(object):
def __init__(self, fmt, args):
self.fmt = fmt
self.args = args
def __str__(self):
return self.fmt + ''.join(str(arg) for arg in self.args)
class CommonLoggerAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(CommonLoggerAdapter, self).__init__(logger, extra or {})
def log(self, level, msg, *args, **kwargs):
if self.isEnabledFor(level):
msg, kwargs = self.process(msg, kwargs)
self.logger._log(level, Message(msg, args), (), **kwargs)
显然,使用适配器实现而不是记录器实现效果更好,因为 logging.config 在它们之间共享。 如果要使用 Logger 实现,则需要在初始化时执行此操作:
def __init__(name):
for handler in logging._handlers.values():
self.addhandler(handler)
这两个选项都有效! 希望它也能帮助其他人!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.