日志(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 使用同一日志文件路径。 - 日志格式包含
PID与RANK,便于定位分布式进程输出。
管理方法(来自 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(...)(仅主进程)。