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

Python的wrapper/decorator能否禁用被包裹代码内部的所有日志输出?

完整实现代码

我们可以通过临时修改Python logging模块的全局禁用级别实现日志拦截,装饰器代码如下:

import logging
from functools import wraps

def prevent_logs_wrapper(func):
    @wraps(func)  # 保留原函数的元信息,避免装饰器修改原函数属性
    def wrapper(*args, **kwargs):
        # 先存储当前的日志禁用级别
        original_disable_level = logging.root.manager.disable
        # 禁用所有低于CRITICAL级别的日志,常规日志都会被拦截
        logging.disable(logging.CRITICAL)
        try:
            return func(*args, **kwargs)
        finally:
            # 无论函数执行是否成功,都恢复原有日志配置
            logging.disable(original_disable_level)
    return wrapper

效果验证

用你给出的示例测试,代码如下:

logger = logging.getLogger(__name__)
# 初始化日志配置,默认开启INFO以上级别输出
logging.basicConfig(level=logging.INFO, format="[%(levelname)s] %(message)s")

@prevent_logs_wrapper
def some_logs():
    logger.info('Log an info msg')
    logger.warning('Log a warning msg')
    print("函数正常执行,仅该打印输出")

# 调用后不会输出任何日志,仅显示print内容
some_logs()

说明

  • 该实现不会修改原函数的执行逻辑,仅临时拦截日志输出,函数执行完成后会自动恢复原有日志配置,不会影响函数外的日志打印
  • 即使被装饰的函数执行抛出异常,finally分支也会保证日志配置被恢复,不会产生全局影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:21:01