你如何使用默认回退到在 Python 中打印的包中的日志记录?



我想将包的print语句更改为使用logging.所以我会像这样写我的脚本

import logging
logger = logging.getLogger(__name__)
def func():
logger.info("Calling func")

推荐哪种方法?

但是,许多用户不初始化日志记录,因此不会看到输出。

是否有推荐的方法,以便未初始化日志记录的用户可以看到info输出,并且显式设置日志记录的用户不会被我的包篡改其特定配置?

作为一般经验法则,模块不应直接配置logging(并对共享的 STDOUT/STDERR 进行其他未经请求的更改),因为这是模块用户的领域。如果用户想要输出,他应该显式启用logging然后,只有这样,才应该允许你的模块记录

如果您提供一个接口来显式启用模块中的日志记录,以便用户不必显式更改级别/禁用内部组件的记录器(如果他们只对从自己的代码进行日志记录感兴趣),则加分。

当然,要在 STDOUT/STDERR 处理程序尚未初始化时继续使用logging,您可以使用logging.NullHandler因此您在模块中要做的就是:

import logging
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())  # initialize your logger with a NullHandler

def func():
logger.info("Calling func")
func()  # (((crickets)))

现在,您可以继续在整个模块中使用logger,直到用户初始化logging模块不会主动变更输出,例如:

import your_module
your_module.func()  # (((crickets)))
import logging
logging.root.setLevel(logging.INFO)  
logging.info("Initialized!")  # INFO:root:Initialized!
your_module.func()  # INFO:your_module:Calling func

当然,实际的日志记录格式、级别和其他设置也应该在用户的领域,因此如果他们更改根日志处理程序的格式,它也应该由模块记录器继承。

最新更新