ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Hydra 日志配置完全指南:掌握 `hydra.verbose` 与 `job_logging` 的 Python 日志管理

Hydra 日志配置完全指南:掌握 `hydra.verbose` 与 `job_logging` 的 Python 日志管理 Hydra 日志配置完全指南掌握hydra.verbose与job_logging的 Python 日志管理【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra导读Python 开发者常常因为日志系统logging配置繁琐而弃用标准库loggingHydra 直接帮你把这一层配置好——无需任何 setup 代码你的应用即可在控制台和自动工作目录的日志文件中同时输出INFO级日志。本篇指南以 Hydra 1.3 教程4_logging为核心完整讲解 Hydra 的默认日志行为、通过hydra.verbose在命令行切换DEBUG级别的三种写法以及如何借助hydra/job_logging与hydra/hydra_logging配置组禁用或接管日志输出并深入到hydra/_internal源码与内置 YAML 配置文件帮助你彻底掌控 Hydra 应用中的日志行为。为什么让 Hydra 来配置日志很多人不用 Python logging 的原因是配置成本太高需要手动创建 formatter、handler、决定输出到控制台还是文件、设置 root logger 级别……Hydra 的解决方案是在你的应用运行前由 Hydra 替你完成 Python logging 的全部配置。你唯一要做的事情就是像在任何普通 Python 程序中一样获取 loggerimport logging log logging.getLogger(__name__)然后照常记录消息。Hydra 会在底层依据自身的配置hydra_logging与job_logging两个配置组自动完成 formatter、handler、级别等全部设置。默认行为控制台 日志文件双输出默认情况下Hydra 会在INFO级别同时做两件事把日志输出到控制台把日志写入自动工作目录output dir下的日志文件文件名为${hydra.job.name}.log即你的应用名 .log。这两套默认配置分别对应仓库中的两个内置 YAML 文件Hydra 自身框架日志hydra/conf/hydra/hydra_logging/default.yaml格式为[%(asctime)s][HYDRA] %(message)s仅输出到 stdout你的任务应用日志hydra/conf/hydra/job_logging/default.yaml格式为[%(asctime)s][%(name)s][%(levelname)s] - %(message)s同时挂载consolelogging.StreamHandler与filelogging.FileHandler两个 handler。其中job_logging的 file handler 通过插值引用 Hydra 运行时信息指向实际输出路径handlers: file: class: logging.FileHandler formatter: simple # absolute file path filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log也就是说每次运行任务Hydra 都会在自动工作目录里生成一个以应用名命名的.log文件与你打印到控制台的内容格式一致方便日后排查与归档。最小示例开箱即用的日志仓库中对应的完整示例位于 examples/tutorials/basic/running_your_hydra_app/4_logging/my_app.pyimport logging from omegaconf import DictConfig import hydra # A logger for this file log logging.getLogger(__name__) hydra.main() def my_app(_cfg: DictConfig) - None: log.info(Info level message) log.debug(Debug level message) if __name__ __main__: my_app()运行它$ python my_app.py [2019-06-27 00:52:46,653][__main__][INFO] - Info level message注意两点INFO级消息被正常打印DEBUG级消息不会出现因为默认 root logger 级别是INFO。同时工作目录下会生成my_app.log内容与上述输出一致。用hydra.verbose开启 DEBUG 日志从命令行覆盖hydra.verbose即可开启DEBUG级日志。它的取值可以是布尔值、字符串或列表对应三种不同粒度的控制写法效果hydra.verbosetrue将所有logger 的级别设为DEBUGhydra.verboseNAME仅将名为NAME的 logger 设为DEBUG等价于import logging; logging.getLogger(NAME).setLevel(logging.DEBUG)hydra.verbose[NAME1,NAME2]同时将NAME1、NAME2两个 logger 设为DEBUG示例输出同时开启__main__与hydra两个 logger 的 DEBUG$ python my_app.py hydra.verbose[__main__,hydra] [2019-09-29 13:06:00,880] - Installed Hydra Plugins [2019-09-29 13:06:00,880] - *********************** ... [2019-09-29 13:06:00,896][__main__][INFO] - Info level message [2019-09-29 13:06:00,896][__main__][DEBUG] - Debug level message可以看到除了任务日志Hydra 框架自身的hydralogger 也进入了 DEBUG 模式输出了Installed Hydra Plugins等框架级调试信息便于诊断 Hydra 初始化阶段的问题。底层实现verbose 如何生效从源码看hydra.verbose的配置在应用启动与任务启动两个阶段都会生效应用初始化阶段在 hydra/_internal/hydra.py 中调用configure_log(cfg.hydra.hydra_logging, cfg.hydra.verbose)每个任务启动阶段在 hydra/_internal/core_plugins/basic_launcher.py 与 hydra/_internal/core_plugins/basic_launcher.py 中再次调用configure_log。也就是说verbose的值最终被传给统一的日志配置函数由它解析布尔、字符串或列表形式并在既有配置之上追加 DEBUG 级别设置——这就是命令行一行覆盖即可穿透到所有 logger 的原理。禁用或关闭日志输出直接关掉任务日志输出把hydra/job_logging这个配置组切到disabled即可让任务日志完全不输出$ python my_app.py hydra/job_loggingdisabled NO OUTPUT对应的配置 hydra/conf/hydra/job_logging/disabled.yaml 将 root logger 级别抬高到ERROR并设置disable_existing_loggers: true从而屏蔽绝大部分输出。让 Hydra 完全不接管日志如果你希望自己完全掌控日志配置比如自己的程序里已经配置好了 logging可以同时设置hydra/job_loggingnoneHydra 不再配置任务日志hydra/hydra_loggingnoneHydra 不再配置框架自身日志。两者的none配置hydra/conf/hydra/hydra_logging/none.yaml 与 hydra/conf/hydra/job_logging/none.yaml都把root设为null、disable_existing_loggers设为false等价于不触碰 Python logging 的现有状态把配置权完整交还给你。几个内置配置组的取舍在hydra/conf/hydra下job_logging与hydra_logging两个配置组各自提供了多个选项job_loggingdefault、disabled、none、stdouthydra/conf/hydra/job_logging/stdout.yaml仅输出到控制台、格式为纯消息适合希望只打 stdout 不落盘的场景hydra_loggingdefault、disabled、none、hydra_debug。选择策略保留默认控制台 文件双输出最省心只要控制台切hydra/job_loggingstdout完全静默切hydra/job_loggingdisabled完全交给自己的 logging同时切none。深入了解配置结构Hydra 的日志配置文件遵循 Pythonlogging.config的标准字典格式version: 1核心字段包括formatters定义输出格式模板handlers定义输出目标logging.StreamHandler到 stdout、logging.FileHandler到文件等并挂接 formatterroot设置 root logger 的级别与 handler 列表loggers对特定名称的 logger 单独覆盖级别例如hydra_logging/default.yaml中内置的logging_examplelogger 被设为DEBUGdisable_existing_loggers是否禁用已有 loggerfalse表示保留。理解了这套结构你就能在自己应用中模仿内置配置写出完全一致的日志样式。更进一步完全自定义日志hydra/job_logging、hydra/hydra_logging都是标准的配置组你可以通过 Hydra 的配置组机制覆盖默认 YAML实现完全自定义的日志格式、级别与输出目标例如 JSON 日志、写入日志服务等。完整的自定义指南参见 Hydra 1.3 日志自定义文档其中详细介绍了如何编写自定义的 logging 配置文件、如何在配置组中注册并使用以及verbose与自定义配置的配合方式。【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表