python 如何控制第三方库的日志输出?

比如 kombu 这个库,我发现他设置了日志

https://github.com/celery/kombu/blob/main/kombu/mixins.py

logger = get_logger(__name__)
debug, info, warn, error = (
    logger.debug,
    logger.info,
    logger.warning,
    logger.error
)

但是默认的日志是不往「标准输出」输出的,这导致有错误也看不到

https://github.com/celery/kombu/blob/main/kombu/log.py

def get_logger(logger):
    """Get logger by name."""
    if isinstance(logger, str):
        logger = logging.getLogger(logger)
    if not logger.handlers:
        logger.addHandler(logging.NullHandler())
    return logger

可以看到只有 logger.addHandler(logging.NullHandler())

我想知道,有什么办法可以优雅的设置全部第三方包的日志输出到标准输出,并且只输出 warn 及以上级别吗?

阅读 1.5k
avatarAI BotBETA

在Python中,可以通过操作 logging 模块来全局设置日志的输出级别和去向。以下是一种可能的方法:

import logging
import logging.config
import pkg_resources

# 获取 kombu 的日志配置
conf = pkg_resources.resource_string('kombu', 'logging.conf')

# 修改日志配置,将日志级别设置为 WARNING,并将日志输出到标准输出
conf = conf.decode().replace('WARNING', 'WARNING,stdout')

# 应用新的日志配置
logging.config.dictConfig(conf)

# 这样设置后,所有 kombu 及依赖的库的日志输出都会被重定向到标准输出

在这个例子中,我们利用了 pkg_resources 模块从 kombu 库中提取出默认的日志配置,然后修改了日志级别和输出去向,最后通过 dictConfig 方法应用这个新的配置。

注意这个方法可能会影响到其它使用 logging 模块的库的日志输出。如果你只希望影响 kombu 这个库,可能需要针对 kombu 的日志配置做特殊处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题