在导入模块之前,设置日志记录系统(格式化、级别(的标准方法是什么?
我想这样做的原因是在导入阶段加载复杂的数据结构,并用记录器显示进度。但是由于没有设置日志记录级别,我甚至看不到那些日志条目(默认级别为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()
的参数或用户提供的配置文件进行配置。这意味着在测试过程中,您可以从较小的缩小数据集加载,这样测试套件就不会运行缓慢。