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
相关产品推荐
相关产品推荐

