Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在导入其他模块之前设置日志记录_Python_Logging - Fatal编程技术网

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加载和解析数据文件,其中包含常量数据,将在整个应用程序生命周期中使用。对于每个单独的模块,在该模块中导入之前不执行任何操作。显然,导入该模块将在全局级别运行操作,将所有模块逻辑放在一个类中并在实例化时执行可能更好?