日志#

conda 中的日志记录基于 Python 日志框架。在本指南中,我们将描述 conda 中使用的记录器和处理程序,以及它们的使用方式。

记录器层次结构#

Python 日志记录使用记录器作为日志消息的来源。这些记录器组织成一个由赋予各个记录器的名称定义的单一层次结构,其中一个无名根记录器。其他记录器名称以点分隔的字符串形式给出,例如,名为 a.b.c 的记录器的父级为 a.b,而 a.b 的父级又为 aa 的父级又是根记录器。Python 程序可以自由地为他们喜欢的记录器使用任何名称,但通常名称会与使用它的 Python 实体相关联,最常见的是模块级记录器,它被称为 __name__,即 conda.<pkg>.<module>,例如 conda.gateways.logging。这种方法自然地将单个代码库中使用的记录器组织成一个遵循包结构的层次结构。

Conda 在很大程度上遵循这种方法,但是,它也使用一些额外的记录器。

flowchart LR root["&lt;root&gt;"] -.-> conda conda --> modules["conda.&lt;pkg&gt;.&lt;module&gt;"] conda -.-> conda.stdout -.-> conda.stdout.verbose conda -.-> conda.stderr conda -.-> conda.stdoutlog conda -.-> conda.stderrlog root --> auxlib root --> progress.update & progress.stop

conda 记录器层次结构。虚线表示与 propagate = False 的关系。#

完整的模块级记录器层次结构在下面的 full-module-loggers 中给出。

根记录器#

根记录器不直接用作日志记录目标,但它用作日志记录系统配置中的构建块。

conda 子层次结构#

conda 子层次结构由名称以 conda. 开头的所有记录器组成,它主要通过 conda.gateways.logging.initialize_logging() 中的 conda 记录器本身进行配置。

此外,以下五个记录器用于其他输出。这些很可能会被替换,不应在新代码中使用。

  • conda.stdout

  • conda.stderr

  • conda.stdoutlog

  • conda.stderrlog

  • conda.stdout.verbose

其他记录器#

conda 中还出现了三个记录器,即 progress.updateprogress.stop,它们仅出现在 conda.plan.execute_actions 中,而 conda.plan.execute_actions 本身已被弃用(参见 conda/conda#13881);以及 auxlib,这很可能是 auxlib 代码完全吸收到 conda 之前的残留物,因为它似乎只在 conda.auxlib.__init__ 中用 conda.auxlib.NullHandler 修饰。

对其他记录器的潜在影响#

还有三个函数使用 logging.getLogger(),因此可能会影响其他记录器。它们是 conda.gateways.logging.set_file_logging(),它从未使用在代码库中,以及上下文管理器 conda.common.io.disable_logger()conda.common.io.stderr_log_level(),它们仅在测试中使用。

auxlib 中的根记录器#

conda.auxlib.logz 中,根记录器被修改。