日志记录#

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

记录器层次结构#

Python 日志记录使用记录器作为日志消息的来源。这些记录器被组织为由赋予各个记录器的名称定义的单个层次结构,其中包含一个无名的根记录器。其他记录器名称以点分隔字符串的形式给出,例如,名为 a.b.c 的记录器具有父记录器 a.b,而后者又具有父记录器 a,后者又以根记录器作为其父记录器。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 中,根记录器被修改了。