如何使用默认返回到Python打印的登录包?
我想将我的包的如何使用默认返回到Python打印的登录包?,python,logging,Python,Logging,我想将我的包的打印语句更改为使用日志记录。所以我会像这样写我的脚本 import logging logger = logging.getLogger(__name__) def func(): logger.info("Calling func") 推荐哪种方式 但是,许多用户不会初始化日志记录,因此不会看到输出 是否有一种推荐的方法,使不初始化日志记录的用户可以看到信息输出,而那些明确设置日志记录的用户不会被我的软件包篡改其特定配置?作为一般经验法则,模块不应直接配置日志记录(并
打印
语句更改为使用日志记录
。所以我会像这样写我的脚本
import logging
logger = logging.getLogger(__name__)
def func():
logger.info("Calling func")
推荐哪种方式
但是,许多用户不会初始化日志记录,因此不会看到输出
是否有一种推荐的方法,使不初始化日志记录的用户可以看到
信息
输出,而那些明确设置日志记录的用户不会被我的软件包篡改其特定配置?作为一般经验法则,模块不应直接配置日志记录
(并对共享STDOUT/STDERR进行其他未经请求的更改),因为这是模块用户的领域。如果用户想要输出,他应该显式地启用日志记录
,然后,也只有在那时,您的模块才被允许登录
如果您提供了一个在模块内显式启用日志记录的界面,这样用户就不必显式地更改内部组件的级别/禁用日志记录者(如果他们只对从自己的代码进行日志记录感兴趣),那么就可以获得额外的积分
当然,要在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)))
现在,您可以在整个模块中继续使用记录器
,直到用户初始化日志
您的模块不会擅自更改输出,例如:
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
当然,实际的日志格式、级别和其他设置也应该在用户的领域中,因此,如果他们更改根日志处理程序的格式,那么它也应该由模块记录器继承