diff --git a/source/isaaclab/changelog.d/mataylor-fix-kitless-renderer-logging.rst b/source/isaaclab/changelog.d/mataylor-fix-kitless-renderer-logging.rst new file mode 100644 index 000000000000..ba2f6b5fdf7d --- /dev/null +++ b/source/isaaclab/changelog.d/mataylor-fix-kitless-renderer-logging.rst @@ -0,0 +1,5 @@ +Fixed +^^^^^ + +* Fixed ``[INFO]: Created new renderer for simulation`` and ``[INFO]: Using renderer`` log lines + being silenced when running with kitless physics backends (Newton, OvPhysX). diff --git a/source/isaaclab/isaaclab/app/logging_utils.py b/source/isaaclab/isaaclab/app/logging_utils.py index 6b087260cd05..1650d0192dd0 100644 --- a/source/isaaclab/isaaclab/app/logging_utils.py +++ b/source/isaaclab/isaaclab/app/logging_utils.py @@ -16,6 +16,7 @@ import argparse import logging import sys +from contextlib import contextmanager def resolve_python_logging_level(launcher_args: argparse.Namespace | dict | None = None) -> int: @@ -48,6 +49,27 @@ def resolve_python_logging_level(launcher_args: argparse.Namespace | dict | None return logging.WARNING if level == logging.NOTSET else level +@contextmanager +def force_log_level(level: int): + """Context manager that temporarily lowers the root logger and its handlers to *level*, then restores them. + + Args: + level: The logging level to enforce inside the block (e.g. :data:`logging.INFO`). + """ + root = logging.getLogger() + saved_root = root.level + saved_handlers = [(h, h.level) for h in root.handlers] + root.setLevel(level) + for h, _ in saved_handlers: + h.setLevel(level) + try: + yield + finally: + root.setLevel(saved_root) + for h, saved in saved_handlers: + h.setLevel(saved) + + def apply_python_logging_level(level: int) -> None: """Apply a Python logging level to the root logger and its handlers. diff --git a/source/isaaclab/isaaclab/renderers/render_context.py b/source/isaaclab/isaaclab/renderers/render_context.py index 76a29ace1895..37107539e2f8 100644 --- a/source/isaaclab/isaaclab/renderers/render_context.py +++ b/source/isaaclab/isaaclab/renderers/render_context.py @@ -10,6 +10,7 @@ import logging from typing import Any, cast +from isaaclab.app.logging_utils import force_log_level from isaaclab.sensors.camera.camera_data import CameraData from .base_renderer import BaseRenderer @@ -78,10 +79,8 @@ def get_renderer(self, cfg: RendererCfg) -> BaseRenderer: return r new_renderer = cast(BaseRenderer, Renderer(cfg)) # type: ignore[misc] self._renderer_entries.append((cfg, new_renderer)) - logger.info( - "Created new renderer for simulation: %s", - type(new_renderer).__name__, - ) + with force_log_level(logging.INFO): + logger.info("Created new renderer for simulation: %s", type(new_renderer).__name__) if self._physics_initialized: new_renderer.initialize() return new_renderer diff --git a/source/isaaclab/isaaclab/sensors/camera/camera.py b/source/isaaclab/isaaclab/sensors/camera/camera.py index d88fee4e6b55..2484cffe00d2 100644 --- a/source/isaaclab/isaaclab/sensors/camera/camera.py +++ b/source/isaaclab/isaaclab/sensors/camera/camera.py @@ -17,6 +17,7 @@ import isaaclab.sim as sim_utils import isaaclab.utils.sensors as sensor_utils +from isaaclab.app.logging_utils import force_log_level from isaaclab.cloner import queue_replication from isaaclab.renderers import BaseRenderer, CameraRenderSpec from isaaclab.sim.views import FrameView @@ -512,7 +513,8 @@ def _initialize_impl(self): if sim_ctx is None: raise RuntimeError("SimulationContext is not initialized.") self._renderer = sim_ctx.render_context.get_renderer(self.cfg.renderer_cfg) - logger.info("Using renderer: %s", type(self._renderer).__name__) + with force_log_level(logging.INFO): + logger.info("Using renderer: %s", type(self._renderer).__name__) # Build the render spec early — both the wrapper ISP (which delegates # any renderer-side per-camera setup) and ``create_render_data`` consume