Skip to main content

日志(Logging)

统一的日志初始化由 Runner.setup_logger 完成。

wall_e/runner/runner.py (L270–288)
def setup_logger(self):
return Logger.get_instance(
"runner",
level=..., rank_level=..., to_file=..., folder=..., run_name=...
)

要点:

  • level 为主进程日志级别;rank_level 为分布式从进程日志级别。
  • 可选输出到文件(to_file)并设置日志目录(folder)与 run_name
  • logger.just_print() 可用于仅在主进程打印较长信息(如模型结构)。

Logger 关键能力

wall_e/logging/logger.py (L29–76)
class Logger(ManagerMixin):
def __init__(self, name, level, rank_level=None, to_file=True, folder="./logs", run_name="", **kwargs): ...
# Master/Worker 级别、控制台与文件 Handler、分布式 rank 注入(PID/RANK)
wall_e/logging/logger.py (L65–74, L140–155)
def configure_handlers(...): ...
def _add_file_handler(...): ... # 主进程创建日志文件名,广播到各 rank,共享写入

@master_only
def just_print(self, obj, ...): ... # 仅主进程 stdout 与可选文件同步
wall_e/logging/logger.py (L116–139)
def log(self, text, level="INFO"): ...
def debug/info/warning/error/critical(self, obj): ...

说明:

  • 所有进程都有控制台输出;当 to_file=True 时,各 rank 使用同一日志文件路径。
  • 日志格式包含 PIDRANK,便于定位分布式进程输出。

管理方法(来自 ManagerMixin)

Logger 通过 ManagerMixin 支持全局实例管理:

wall_e/logging/util.py (L6–35)
from .logger import Logger

def print_log(msg, logger=None, level='INFO'): ...

print_log 用法与行为:

  • logger is None:直接 print
  • logger is logging.Logger:调用其 log
  • logger == 'silent':不输出;
  • logger == 'current':使用最近创建的 Logger 实例(通过 Logger.get_current_instance());
  • logger is str:按名称获取既有 Logger 实例,否则抛错;
  • 其他类型抛 TypeError

注意:

  • 使用 Logger.get_instance(name, ...) 创建命名实例;
  • 后续可用 Logger.get_instance(name) 复用同名实例,或 Logger.get_current_instance() 获取最近创建的实例;
  • Logger.check_instance_created(name) 可用于存在性判断。

推荐实践

  • 训练入口处创建一次 runner 日志实例,由 Runner.setup_logger 管理;
  • 子模块用 print_log(msg, logger='current') 复用当前实例;
  • 大段结构化输出用 logger.just_print(...)(仅主进程)。