Python 在导入其他模块之前设置日志记录
在导入模块之前,设置日志系统(格式化、级别)的标准方法是什么 我之所以要这样做,是因为在导入阶段加载了复杂的数据结构,并且使用记录器显示了进度。但由于没有设置日志记录级别,我甚至看不到那些日志条目(默认级别为Python 在导入其他模块之前设置日志记录,python,logging,Python,Logging,在导入模块之前,设置日志系统(格式化、级别)的标准方法是什么 我之所以要这样做,是因为在导入阶段加载了复杂的数据结构,并且使用记录器显示了进度。但由于没有设置日志记录级别,我甚至看不到那些日志条目(默认级别为警告) 我可以这样做: import logging logging.basicConfig(...) import mymodule 但我不喜欢在导入东西之前运行代码 难道没有一种公认的方法可以从应用程序外部使用env变量或任何类似的替代方案“预配置”日志系统吗?比如: LOG_LE
警告)
我可以这样做:
import logging
logging.basicConfig(...)
import mymodule
但我不喜欢在导入东西之前运行代码
难道没有一种公认的方法可以从应用程序外部使用env变量或任何类似的替代方案“预配置”日志系统吗?比如:
LOG_LEVEL=INFO LOG_FORMAT="..." python main.py
当然,我可以自己评估这些环境变量(在这一点上,我上面的hack已经足够好了),但我想在实现我自己的解决方案之前重用现有的想法。据我所知,没有办法用不同的默认行为预配置日志系统。最佳做法是避免在导入时配置日志记录—由用户决定适当的日志级别和日志应该放在哪里(如果有)。要使日志配置可配置,需要将其延迟到应用程序的入口点,而不是在导入时急切地进行配置
库代码(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()
的参数或用户提供的配置文件配置初始化数据集。这意味着在测试期间,您可以从较小的缩小数据集加载,这样测试套件就不会运行缓慢。如果您不喜欢在导入内容之前运行代码,那么为什么mymodule
会在导入时加载复杂的数据结构?通常库模块只声明一堆东西(def
,class
,可能是一些全局属性),在导入时不做任何繁重的工作。@wim加载和解析数据文件,其中包含常量数据,将在整个应用程序生命周期中使用。对于每个单独的模块,在该模块中导入之前不执行任何操作。显然,导入该模块将在全局级别运行操作,将所有模块逻辑放在一个类中并在实例化时执行可能更好?