You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python3自定义日志级别异常:log.error输出级别名为DEBUG

问题分析与解决方案:log.error输出DEBUG级别名称的原因及修复

你遇到的这个问题,核心是把日志级别数值和名称的对应关系搞反了,咱们一步步拆解:

先明确logging模块的默认级别映射

默认情况下,logging的级别数值和对应名称是固定的:

  • 50 → CRITICAL
  • 40 → ERROR
  • 30 → WARNING
  • 20 → INFO
  • 10 → DEBUG

log.error()方法本质上是在输出级别数值为40的日志,这是模块内置的逻辑,不会因为你修改级别名称而改变方法对应的数值。

你的代码问题出在哪

看你写的这几行:

logging.addLevelName(50, "ERROR")
logging.addLevelName(40, "DEBUG")

你把数值40对应的名称改成了DEBUG,而数值50改成了ERROR——这就完全颠倒了!当你调用log.error()时,它还是输出40级的日志,自然就会显示成DEBUG了。

修复后的代码

把级别数值和名称的对应关系改回匹配方法的逻辑就行,如果你只是想把原DEBUG的级别名称改成VERBOSE,其他保持正常,修正后的代码如下:

class LogAttribute:
    def __init__(self):
        logger = logging.getLogger()
        # 修正级别映射:让数值40对应ERROR(匹配log.error()的内置逻辑)
        logging.addLevelName(50, "CRITICAL")
        logging.addLevelName(40, "ERROR")
        logging.addLevelName(30, "WARNING")
        logging.addLevelName(20, "INFO")
        logging.addLevelName(10, "VERBOSE")  # 这里替换原DEBUG的名称,没问题
        check = logging.getLevelName(40)
        logger.setLevel(config_obj["loggerLevel"])
        output_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        filename = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + "_EP_script.log"
        handler = logging.FileHandler(os.path.join(output_dir, filename))
        formatter = logging.Formatter(" %(levelname)s - %(message)s")
        handler.setFormatter(formatter)
        logger.addHandler(handler)

额外补充:自定义级别小技巧

如果你想新增VERBOSE这种自定义级别,除了修改名称,还可以给logger添加对应的方法,方便调用:

# 定义自定义级别常量
logging.VERBOSE = 10
logging.addLevelName(logging.VERBOSE, "VERBOSE")

# 给Logger类添加verbose方法
def verbose(self, msg, *args, **kwargs):
    if self.isEnabledFor(logging.VERBOSE):
        self._log(logging.VERBOSE, msg, args, **kwargs)
logging.Logger.verbose = verbose

之后你就可以直接用logger.verbose("这是VERBOSE级别的日志")来输出对应级别的内容了。

内容的提问来源于stack exchange,提问作者tintin

火山引擎 最新活动