亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 740 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號