Python如何静态使用类实例 解决Logger类静态方法变量未定义问题
Python日志工具类静态调用问题修复方案
错误原因
你代码中定义的Log是set静态方法的局部变量,作用域仅局限在set方法内部,debug方法无法跨方法访问该变量,因此会抛出NameError: name 'Log' is not defined错误。
解决方案
使用类变量存储全局日志实例,所有静态方法都通过类变量访问日志实例即可,修改后的完整代码如下:
import logging class Logger: # 类级别的变量,全局唯一存储日志实例 _logger = None @staticmethod def set(log_module_name, log_level): Logger._logger = logging.getLogger(log_module_name) Logger._logger.setLevel(log_level) formatter = logging.Formatter('%(asctime)s.%(msecs)03d %(name)s %(levelname).1s %(message)s', "%m-%d %H:%M:%S") stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) Logger._logger.addHandler(stream_handler) @staticmethod def debug(msg): # 增加初始化校验,避免未初始化直接调用报错 if not Logger._logger: raise RuntimeError("请先调用Logger.set()方法完成日志初始化") Logger._logger.debug(msg)
如果需要支持info、warning、error等其他日志级别,按照debug方法的格式扩展对应静态方法即可。
调用方式
和你期望的调用逻辑一致,只需先执行一次初始化操作:
import logging # 初始化(全局仅需执行一次) Logger.set("my_module", logging.DEBUG) # 直接通过类名调用 Logger.debug("test message")
注意事项
- 日志初始化操作全局仅需执行一次,多次调用
set方法会重复添加日志处理器,导致同一条日志多次输出 - 如果需要区分不同模块的日志,可以将类变量
_logger修改为字典结构,按模块名存储多个日志实例
内容的提问来源于stack exchange,提问作者Sunny An
相关产品推荐
相关产品推荐

