尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Hydra 日志定制完全指南:用 dictConfig 深度控制 job_logging 与 hydra_logging

Hydra 日志定制完全指南:用 dictConfig 深度控制 job_logging 与 hydra_logging Hydra 日志定制完全指南用 dictConfig 深度控制 job_logging 与 hydra_logging【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydraHydra 基于 Python 标准库logging的dictConfig机制完成日志初始化并将日志配置拆分为**Hydra 自身hydra_logging与被调度任务job_logging**两套相互独立的配置。本指南以仓库中的 logging 示例 为主线讲解如何通过 config group 覆盖默认行为——例如仅输出到 stdout、精简日志格式——并下沉到 configure_log 实现 与内置配置组让你掌握从改格式、换 handler 到彻底关闭日志的完整定制能力。两套日志配置hydra_logging 与 job_loggingHydra 初始化日志时调用的是 Python 标准库的logging.config.dictConfig详见 Python logging 官方 HOWTO。它维护着两套相互独立的 Python logging 配置hydra_logging控制 Hydra 框架自身的日志输出如配置加载、compose 过程、sweep 信息配置位于hydra/conf/hydra/hydra_logging/job_logging控制被 Hydra 启动的应用job日志输出配置位于hydra/conf/hydra/job_logging/。在源码层面二者均由 configure_log 统一处理先通过OmegaConf.to_container(log_config, resolveTrue)把DictConfig解析为普通字典再在conf[root] is not None时调用logging.config.dictConfig(conf)。若配置为None则退化为默认的 stdout handler 与[%(asctime)s][%(name)s][%(levelname)s] - %(message)s格式。该函数在 hydra/_internal/hydra.py#L676 处以configure_log(cfg.hydra.hydra_logging, cfg.hydra.verbose)的形式被调用其中第二个参数cfg.hydra.verbose用于后续的调试级别提升详见下文 verbose 一节。两套配置都是 config group因此可以用同样的覆盖语法独立替换hydra/job_loggingxxx与hydra/hydra_loggingxxx。实战示例任务日志仅输出到 stdout 并精简格式仓库中的 examples/configure_hydra/logging 完整演示了仅 stdout、无日志文件、更简单的行格式这一需求。项目结构如下examples/configure_hydra/logging/ ├── conf │ ├── config.yaml │ └── hydra │ └── job_logging │ └── custom.yaml └── my_app.py应用的入口 my_app.py 通过hydra.main(config_pathconf, config_nameconfig)启动并在函数体内记录一条log.info(Info level message)import logging import hydra from omegaconf import DictConfig log logging.getLogger(__name__) hydra.main(config_pathconf, config_nameconfig) def my_app(_cfg: DictConfig) - None: log.info(Info level message) if __name__ __main__: my_app()根配置 conf/config.yaml 通过 defaults 列表把应用的日志配置切换到自定义实现defaults: - override hydra/job_logging: custom自定义日志配置位于 conf/hydra/job_logging/custom.yaml它是一份完整的dictConfig规范字典相比早期版本文档中的精简写法仓库中的版本包含了完整字段version: 1 formatters: simple: format: [%(levelname)s] - %(message)s handlers: console: class: logging.StreamHandler formatter: simple stream: ext://sys.stdout root: handlers: [console] disable_existing_loggers: false与原文档描述的默认行为对比输出差异一目了然# 默认 job_loggingdefault.yaml时间戳 logger 名 级别 消息同时写 console 与文件 $ python examples/configure_hydra/logging/my_app.py hydra/job_loggingdefault [2019-09-26 18:58:05,477][__main__][INFO] - Info level message # 自定义 job_loggingcustom.yaml仅 [级别] - 消息只输出到 stdout $ python examples/configure_hydra/logging/my_app.py [INFO] - Info level message这一行为有测试用例背书tests/test_examples/test_configure_hydra.py#L88-L95 的test_logging断言运行该示例后输出恰好为[INFO] - Info level message证明上述配置真实生效。dictConfig 关键字段逐项解析要自由定制日志需要理解custom.yaml中每个字段的作用字段取值含义version1固定为 1dictConfig的 schema 版本号不可省略formatters.name.format任意LogRecord属性占位符定义输出格式。如[%(levelname)s] - %(message)s也可用%(asctime)s时间、%(name)slogger 名等handlers.name.classlogging.StreamHandler、logging.FileHandler等handler 类型决定日志去向handlers.name.formatter上文定义的 formatter 名该 handler 使用哪个 formatterhandlers.name.streamext://sys.stdout/ext://sys.stderrStreamHandler 的输出流ext://前缀表示引用 Python 外部对象root.handlershandler 名列表root logger 挂载哪些 handlerroot.levelINFO、DEBUG、ERROR等root logger 的过滤级别示例中省略时使用默认级别disable_existing_loggerstrue/false是否禁用配置前已存在的 logger一般设为false避免意外屏蔽第三方库日志值得注意的是dictConfig的字典本身也是 Hydra 配置因此支持${...}插值。内置的 hydra/conf/hydra/job_logging/default.yaml 就利用这一点把日志文件写到当前运行输出目录文件名与 job 名一致version: 1 formatters: simple: format: [%(asctime)s][%(name)s][%(levelname)s] - %(message)s handlers: console: class: logging.StreamHandler formatter: simple stream: ext://sys.stdout file: class: logging.FileHandler formatter: simple # 绝对路径输出目录 任务名 filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log root: level: INFO handlers: [console, file] disable_existing_loggers: false由于configure_log在dictConfig前会执行resolveTrue这些插值会在应用配置前被解析为真实路径这正是默认同时写控制台和 job 日志文件这一行为的实现来源。内置 job_logging 选项一览与取舍hydra/conf/hydra/job_logging/目录提供四个内置选项可在命令行或 defaults 中通过hydra/job_loggingoption直接切换选项文件行为defaultdefault.yaml控制台 写入${hydra.runtime.output_dir}/${hydra.job.name}.log日志文件stdoutstdout.yaml仅 stdout且格式精简为%(message)sdisableddisabled.yaml仅保留ERROR级别并disable_existing_loggers: truenonenone.yamlroot: null即完全不配置 root logger配合configure_log中conf[root] is None的分支逻辑其中none与disabled的差异值得注意none让configure_log走root 为 None的分支而跳过 dictConfig因此不会主动触碰任何 loggerdisabled则仍执行 dictConfig把 root 级别压到ERROR并禁用既有 logger。需要彻底静音任务日志时tests/test_examples/test_configure_hydra.py#L98-L107 的test_disabling_logging展示了标准做法同时传入hydra/job_loggingnone与hydra/hydra_loggingnone并断言 stdout 输出为空。hydra_logging控制 Hydra 自身的日志与 job_logging 平行hydra/conf/hydra/hydra_logging/提供 Hydra 框架自身的日志选项defaultdefault.yaml格式为[%(asctime)s][HYDRA] %(message)s仅 stdoutroot 级别INFO并内置一个logging_example的DEBUGlogger 用于示例hydra_debughydra_debug.yaml把 Hydra 的DEBUG日志写入hydra-${hydra.job.name}.log文件delay: true延迟创建root 级别压到ERROR以避免干扰disabled/none分别对应仅 ERROR与不配置。在 multirun / sweep 场景中tests/test_basic_launcher.py#L24-L25 会在启动参数中注入hydra/hydra_loggingdisabled、hydra/job_loggingdisabled避免每个 job 重复刷屏框架日志——这也是你在自定义 launcher 或编写集成测试时常用的组合。除切换整套配置外还可以逐字段覆盖。例如 tests/test_callbacks.py#L98-L99 中通过点路径覆盖 formatter 格式python my_app.py hydra.hydra_logging.formatters.simple.format[HYDRA] %(message)s \ hydra.job_logging.formatters.simple.format[JOB] %(message)s这展示了dictConfig字典作为 Hydra 配置的一部分任何字段都可以被命令行 override 精确控制。配合 hydra.verbose 做定向调试configure_log(log_config, verbose_config)的第二个参数来自cfg.hydra.verbose它提供了一种不改日志配置即可提升日志详情的快捷方式见 hydra/core/utils.py#L56-L68verbose: true把 root logger 级别提升为DEBUG全局输出调试日志verbose: logger名或verbose: [logger1, logger2, ...]只把指定 logger如hydra的级别提升为DEBUG实现定向排查避免全局刷屏。小结Hydra 的日志系统可以概括为一条主线两套dictConfig配置job_logging / hydra_logging→ config group 切换与字段覆盖 →configure_log统一加载。定制时优先考虑三个层次在conf/hydra/job_logging/或hydra_logging/下新增自定义 yaml通过 defaultsoverride切换适合全局统一风格如本示例的仅 stdout 精简格式命令行直接切换内置选项hydra/job_loggingstdout|disabled|none适合临时调试与测试场景用点路径覆盖具体字段formatter 格式、handler、level或配合hydra.verbose做定向 DEBUG。只要遵循dictConfig规范、利用ext://引用外部对象、善用${...}插值引用 Hydra 运行时变量就能把 Hydra 应用的日志输出完全纳入掌控。【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表