日志记录#
Conda 中的日志记录基于 Python 日志记录框架。在本指南中,我们将介绍 Conda 中使用的记录器和处理程序,以及它们的使用方式。
记录器层次结构#
Python 日志记录使用记录器作为日志消息的来源。这些记录器被组织为由赋予各个记录器的名称定义的单个层次结构,其中包含一个无名的根记录器。其他记录器名称以点分隔字符串的形式给出,例如,名为 a.b.c
的记录器具有父记录器 a.b
,而后者又具有父记录器 a
,后者又以根记录器作为其父记录器。Python 程序可以自由地为它们使用的记录器使用任何名称,但通常该名称与使用它的 Python 实体有关,最常见的是模块级记录器,称为 __name__
,即 conda.<pkg>.<module>
,例如 conda.gateways.logging
。这种方法自然地将单个代码库中使用的记录器排列成一个层次结构,该层次结构遵循包结构。
Conda 在很大程度上遵循这种方法,但是,它也使用了一些额外的记录器。
所有模块级记录器的完整层次结构在 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.update
和 progress.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
中,根记录器被修改了。