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_config、oslo_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
工作项¶
修改设置代码以创建单独的根日志器和应用程序日志器,并为它们创建自己的处理程序。
修改
getLogger()以处理"oslo_"到"oslo."的转换。
孵化¶
N/A
采用¶
N/A
库¶
N/A
预计 API 稳定¶
N/A
文档影响¶
拟议的更改会影响默认日志级别,但所有配置选项将以相同的方式工作,因此不需要进行文档更改。
依赖项¶
无
参考资料¶
Python 的日志模块:https://docs.pythonlang.cn/2/library/logging.html
Brant Knudson 的补丁,通过
set_defaults()使默认日志器列表可扩展:https://review.openstack.org/#/c/164503
注意
本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode