You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:27:04