oslo.log: 安静的库

包含您的 Launchpad 蓝图的 URL

https://blueprints.launchpad.net/oslo?searchtext=quiet-libraries

问题描述

随着我们添加越来越多的依赖项,我们发现需要自定义这些库的日志输出的情况越来越多。与其强制应用程序管理自己的自定义列表,也不要在 oslo.log 中维护一个大型的自定义列表,不如更改配置日志器树的方式,使库默认保持安静。

提议的变更

我们当前将一个日志处理程序附加到根日志节点,并配置它以使用默认日志级别向用户指定的任何源(文件、syslog 等)发出输出。然后,我们使用 default_log_levels 选项为其他库指定不同的默认设置,通常是为了使其保持安静,以便仅在警告或更高级别产生输出。此配置利用了 Python 的日志模块以树状结构配置日志器这一事实,消息将沿着树向上移动,直到找到处理它们的节点。

这会给我们一个像这样的日志器结构

  • <root> - INFO

    • myapp (消息传播到 <root>)

    • amqp - WARN

    • amqplib - WARN

    • boto - WARN

    • qpid - WARN

    • sqlalchemy - WARN

    • suds - INFO

    • oslo

      • messaging - INFO

    • iso8601 - WARN

    • requests

      • packages

        • urllib3

          • connectionpool - WARN

    • urllib3

      • util

        • retry - WARN

    • keystonemiddleware - WARN

    • routes

      • middleware - WARN

    • stevedore - WARN

这种方法的一个缺点是,库的新版本会影响日志内容,并且需要相当频繁地更新控制它们的设置。随着我们开始支持更多具有其他第三方依赖项的驱动程序,这个问题将会增加。

为了解决这个问题,我们配置日志器,使根节点始终只以 WARN 或更高级别发出数据,然后配置一个以应用程序的基本包命名的日志器,以日志配置标志(--debug--verbose 等)请求的级别发出消息。

仍然会支持 default_log_levels 选项,但可以通过 default_log_levels 管理的具有自定义输出级别的任何库,除非其输出级别与 WARN 不同,否则可以忽略。不过,这只是配置设置中的一项小优化,因此我们不需要实现它。

结果看起来会更像

  • <root> - WARN

    • myapp - INFO (具有本地处理程序)

    • suds - INFO

    • oslo - INFO

其他日志器仍然存在,但不需要对其进行自定义配置。如果最终证明有用,可以根据配置选项为它们分配级别。

将所有 Oslo 库日志器移动到日志器树的 oslo 部分,需要在 oslo_log.log.getLogger() 中进行一些自定义逻辑,以将 "oslo_library" 替换为 "oslo.library"

备选方案

不要将 Oslo 库放在一个公共节点下

我们可以将 Oslo 库的日志记录保留在它们自己的库特定名称下,例如 oslo_configoslo_concurrency 等。但是,这使得难以将它们配置为以一致的级别记录日志。由于 Oslo 库代码是整个 OpenStack 代码库中日益增长的一部分,并且错误通常需要有关库行为的信息才能进行调试,因此将它们全部放在一个公共节点下可以轻松调整日志输出。

保持原样

我们有 default_log_levels 以及通过文件而不是仅通过配置标志配置日志记录的能力,因此部署者可以自行设置。但是,oslo.log 的默认行为应该代表大多数部署者有用的配置,因此在那里进行更改比要求每个部署者自行弄清楚更好。

将根日志器级别设置为 ERROR

与其使用 WARN 作为根日志器的默认级别,我们可以使用 ERROR 甚至 CRITICAL。这将进一步减少额外的输出,但 WARN 似乎应该足以满足我们现在正在使用的大多数库。我们可以在完成主要工作后评估更改级别,因为那时进行实验将是一个简单的更改。

添加根日志器级别配置选项

与其硬编码根日志器的级别,我们可以使用配置选项让部署者控制它。我们可以在完成主要工作后评估此替代方案,因为那时进行实验将是一个简单的更改。

Impact on Existing APIs

没有 API 更改。

我们已经将应用程序名称作为 oslo_log.log.setup()product_name 参数,因此我们可以使用它来设置应用程序的主要日志处理程序。

安全影响

性能影响

Configuration Impact

所有现有的配置选项将继续产生相同的结果。

我们最终可以更改 default_log_levels 的默认值,但一开始不需要这样做。

开发人员影响

Testing Impact

我们需要验证更改 Oslo 库的默认行为后,日志输出是否会显著增加。

实现

负责人

主要负责人:Doug Hellmann

其他贡献者:无

里程碑

完成目标里程碑:Liberty-2

工作项

  1. 修改设置代码以创建单独的根日志器和应用程序日志器,并为它们创建自己的处理程序。

  2. 修改 getLogger() 以处理 "oslo_""oslo." 的转换。

孵化

N/A

采用

N/A

N/A

预计 API 稳定

N/A

文档影响

拟议的更改会影响默认日志级别,但所有配置选项将以相同的方式工作,因此不需要进行文档更改。

依赖项

参考资料

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode