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




