From 12cc3e895dd2fa6635926217c611a584cf592761 Mon Sep 17 00:00:00 2001 From: Vishal Goyal Date: Mon, 5 Jan 2026 19:56:18 +0530 Subject: [PATCH] Fix duplicate logging in better_logging --- etils/eapp/logging_utils.py | 5 +++++ etils/eapp/tests/test_logging_utils.py | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 etils/eapp/tests/test_logging_utils.py diff --git a/etils/eapp/logging_utils.py b/etils/eapp/logging_utils.py index fe90d1f7..cd9f7185 100644 --- a/etils/eapp/logging_utils.py +++ b/etils/eapp/logging_utils.py @@ -62,6 +62,11 @@ def close(self) -> None: def _better_logging() -> None: """Modify Python logging (internal).""" + logger = py_logging.getLogger() + + if getattr(logger, "_better_logging_configured", False): + return + logger._better_logging_configured = True # If `absl.run` was not called (e.g. open source `pytest` tests) if not FLAGS.is_parsed(): return diff --git a/etils/eapp/tests/test_logging_utils.py b/etils/eapp/tests/test_logging_utils.py new file mode 100644 index 00000000..08e32d90 --- /dev/null +++ b/etils/eapp/tests/test_logging_utils.py @@ -0,0 +1,25 @@ +import logging + +from etils.eapp import better_logging + + +def test_better_logging_idempotent(): + logger = logging.getLogger() + + # Reset possible state from other tests + if hasattr(logger, "_better_logging_configured"): + delattr(logger, "_better_logging_configured") + + before = list(logger.handlers) + + better_logging() + after_first = list(logger.handlers) + + better_logging() + after_second = list(logger.handlers) + + # First call may add handlers + assert len(after_first) >= len(before) + + # Second call must not add any more handlers + assert len(after_second) == len(after_first)