为了账号安全,请及时绑定邮箱和手机立即绑定

Python Logger 类不打印日志的实现

Python Logger 类不打印日志的实现

墨色风雨 2022-07-26 10:46:10
我扩展了下面给出的 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))但是当我运行它时,它不会抛出错误 - 但它也不会在控制台上打印任何日志。知道为什么吗?更新:我将其与打印日志的正常流程进行了比较 - 当它作为 Logger 类的实现创建时,我的logging.handlers似乎没有在 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有什么建议么?
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

这最终解决了我的问题:


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)

这两个选项都有效!希望它也对其他人有所帮助!


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 693 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信