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