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

Python logging模块新增TODO自定义日志级别是否可行?

自定义TODO日志级别的弊端

Python官方不建议自定义日志级别核心是因为这类做法违背了logging模块的设计初衷,实际用起来会有几个明确的问题:

  • 语义混乱:logging内置的级别体系是围绕运行时事件的严重程度设计的,从DEBUG到CRITICAL的梯度对应事件对系统正常运行的影响大小。TODO是开发阶段的功能占位标记,不属于运行时事件的范畴,硬插入一个自定义级别会打破整个日志体系的语义一致性——你给TODO设25(介于INFO和WARNING之间)还是15(介于DEBUG和INFO之间)都不符合原有级别的逻辑,后续做日志分级落盘、过滤告警的时候很容易出问题,比如生产环境忘关配置就会把无意义的占位日志打满日志文件,级别设太低又会在调试时被其他日志冲掉看不到。
  • 维护成本高:自定义日志级别需要给Logger类打猴子补丁、手动分配级别数值、适配所有格式化器和过滤器,后续Python版本升级、或者引入第三方日志插件时,很容易出现级别数值冲突、补丁失效的问题,排查起来非常麻烦。如果是多人协作项目,其他开发者还要额外理解你自定义的级别规则,增加不必要的沟通成本。
  • 无法匹配核心需求:你要的调用频率统计能力logging本身不提供,就算加了自定义TODO级别,还是要额外写计数逻辑,相比你现在用print的方案没有本质效率提升,反而多了一堆适配工作。
更优实现方案

完全不需要修改logging的内置机制,用下面两种轻量方案就能覆盖你的需求,后续清理成本也极低:

方案1:零侵入的日志前缀标记

如果不想额外写工具,直接复用现有日志级别,给TODO类日志统一加专属前缀即可,不需要改任何logging配置:

def print_badge(self, pers: Person):
    # 开发阶段用DEBUG/ WARNING级别都可以,前缀做统一标记
    self.log.debug("[TODO] print_badge 功能未实现")

后续要统计调用频率的时候,写一个简单的logging过滤器匹配[TODO]前缀做自动计数即可;要屏蔽这类日志只需要调整日志级别,或者加一行过滤器规则就能全局关闭,对原有日志体系没有任何侵入。

方案2:独立的TODO占位工具(最适配你的工作流)

你的核心需求是两点:触发未实现功能时给出提示、统计调用次数确定开发优先级,写一个几十行的独立工具就能完全覆盖,和logging逻辑解耦:

from collections import defaultdict
import logging

# 全局TODO调用计数
todo_counter = defaultdict(int)
logger = logging.getLogger(__name__)

def todo_mark(func_desc: str):
    """未实现功能占位调用:打日志+自动计数"""
    todo_counter[func_desc] += 1
    logger.warning(f"[TODO] 调用未实现功能: {func_desc},累计调用次数: {todo_counter[func_desc]}")

def get_todo_priority():
    """按调用次数降序返回待开发功能优先级"""
    return sorted(todo_counter.items(), key=lambda x: x[1], reverse=True)

# 业务代码里的用法
def print_badge(self, pers: Person):
    todo_mark("打印工牌功能")

等后续功能开发完成,全局搜索todo_mark关键字逐个删除替换成正式逻辑即可,不会在日志系统里留任何冗余配置。如果想更省事,还可以把这个逻辑做成装饰器,自动读取函数名和函数上的# TODO注释,连手动传功能描述的步骤都能省掉。

开发阶段的临时需求尽量用轻量的外挂逻辑实现,不要为了一时方便修改标准库的核心设计,否则等项目进入正式上线阶段,清理这些定制化改动的成本会远高于当时省下来的时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:21:17