在导入其他模块之前设置日志记录



在导入模块之前,设置日志记录系统(格式化、级别(的标准方法是什么?

我想这样做的原因是在导入阶段加载复杂的数据结构,并用记录器显示进度。但是由于没有设置日志记录级别,我甚至看不到那些日志条目(默认级别为WARNING(

我可以做这样的破解:

import logging
logging.basicConfig(...)
import mymodule

但我不喜欢在导入东西之前先运行代码。

难道没有一种公认的方式来";预配置";来自应用程序外部的日志记录系统,带有env变量还是任何这样的替代方案?类似于:

LOG_LEVEL=INFO LOG_FORMAT="..." python main.py

当然,我可以自己评估这些env-var(在这一点上,我上面的破解已经足够好了(,但在实现我自己的解决方案之前,我希望重用现有的想法。

据我所知,没有办法用不同的默认行为预先配置日志记录系统。最佳做法是避免在导入时配置日志记录——由用户决定适当的日志级别以及日志应该放在哪里(如果有的话(。对于日志记录配置,可配置,它需要延迟到应用程序的入口点,而不是在导入时急切地配置。

库代码(mymodule(不应假定有人正在监视某个终端的输出,甚至不应假定存在可用于日志文件的可写文件系统。

我推荐这种模式:

# main.py
import logging
import mymodule
def main():
# parse cmdline args here
logging.basicConfig(...)
# or logging.config.fileConfig
# or logging.config.dictConfig
mymodule.init()
# do work here
if __name__ == "__main__":
main()

并且在库代码中:

# mymodule.py
import logging
log = logging.getLogger(__name__)
def init():
log.info("loading complex data structures...")

这避免了将初始化日志事件丢弃在地板上,但在库代码中显式init调用还有另一个好处:用于初始化的数据集可以通过init()的参数或用户提供的配置文件进行配置。这意味着在测试过程中,您可以从较小的缩小数据集加载,这样测试套件就不会运行缓慢。

最新更新