From 8a938eefd6f0fc20cc895dbd1e852a313b9b784a Mon Sep 17 00:00:00 2001 From: jchmura Date: Wed, 29 Jul 2026 20:48:21 +0000 Subject: [PATCH 1/3] Add is_env_flag_enabled helper --- gigl/env/constants.py | 6 ++++++ tests/unit/env/constants.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 tests/unit/env/constants.py diff --git a/gigl/env/constants.py b/gigl/env/constants.py index 1396ab670..a1446397b 100644 --- a/gigl/env/constants.py +++ b/gigl/env/constants.py @@ -23,6 +23,7 @@ GIGL_CUDA_DOCKER_URI_ENV_KEY: Final[str] = "GIGL_CUDA_DOCKER_URI" GIGL_COMPONENT_ENV_KEY: Final[str] = "GIGL_COMPONENT" GIGL_BIGQUERY_QUOTA_PROJECT_ENV_KEY: Final[str] = "GIGL_BIGQUERY_QUOTA_PROJECT" +GIGL_DEBUG: Final[str] = "GIGL_DEBUG" def read_resource_config_uri_from_env() -> Optional[str]: @@ -32,3 +33,8 @@ def read_resource_config_uri_from_env() -> Optional[str]: The URI string if the variable is set, else ``None``. """ return os.environ.get(GIGL_RESOURCE_CONFIG_URI_ENV_KEY) + + +def is_env_flag_enabled(env_var_name: str) -> bool: + """Parses an environment variable and returns True iff the variable is set to '1' or 'True' (case-insensitive).""" + return os.environ.get(env_var_name, "").strip().lower() in ("1", "true") diff --git a/tests/unit/env/constants.py b/tests/unit/env/constants.py new file mode 100644 index 000000000..d138b184a --- /dev/null +++ b/tests/unit/env/constants.py @@ -0,0 +1,32 @@ +import os +from unittest.mock import patch + +from gigl.env.constants import is_env_flag_enabled +from tests.test_assets.test_case import TestCase + + +class EnvFlagEnabledTest(TestCase): + def test_env_flag_disabled(self): + env_var = "TEST_ENV_VAR" + with patch.dict(os.environ, {}): + self.assertFalse(is_env_flag_enabled(env_var)) + + def test_env_flag_enabled_1(self): + env_var = "TEST_ENV_VAR" + with patch.dict(os.environ, {env_var: "1"}): + self.assertTrue(is_env_flag_enabled(env_var)) + + def test_env_flag_enabled_True(self): + env_var = "TEST_ENV_VAR" + with patch.dict(os.environ, {env_var: "True"}): + self.assertTrue(is_env_flag_enabled(env_var)) + + def test_env_flag_enabled_true(self): + env_var = "TEST_ENV_VAR" + with patch.dict(os.environ, {env_var: "true"}): + self.assertTrue(is_env_flag_enabled(env_var)) + + def test_env_flag_enabled_true_with_whitespace(self): + env_var = "TEST_ENV_VAR" + with patch.dict(os.environ, {env_var: " true "}): + self.assertTrue(is_env_flag_enabled(env_var)) From a0ccf3b9738531e5cffad1309d1c934bb8b9415e Mon Sep 17 00:00:00 2001 From: jchmura Date: Wed, 29 Jul 2026 20:48:35 +0000 Subject: [PATCH 2/3] Use GIGL_DEBUG to optionally set log level to logging.DEBUG --- gigl/common/logger.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gigl/common/logger.py b/gigl/common/logger.py index 3dd98bb81..a8ffa8b41 100644 --- a/gigl/common/logger.py +++ b/gigl/common/logger.py @@ -6,6 +6,8 @@ from google.cloud import logging as google_cloud_logging +from gigl.env.constants import GIGL_DEBUG, is_env_flag_enabled + _BASE_LOG_FILE_PATH = "/tmp/research/gbml/logs" @@ -37,12 +39,17 @@ def _setup_logger( ) -> None: handler: logging.Handler if not logger.handlers: + if is_env_flag_enabled(GIGL_DEBUG): + log_level = logging.DEBUG + else: + log_level = logging.INFO + if os.getenv("GAE_APPLICATION") or os.environ.get( "KUBERNETES_SERVICE_HOST" ): # Google Cloud Logging client = google_cloud_logging.Client() - client.setup_logging(log_level=logging.INFO) + client.setup_logging(log_level=log_level) else: # Logging locally. Set up logging to console or file if log_to_file: @@ -61,7 +68,7 @@ def _setup_logger( ) handler.setFormatter(formatter) logger.addHandler(handler) - logger.setLevel(logging.INFO) + logger.setLevel(log_level) def process(self, msg: str, kwargs: MutableMapping[str, Any]) -> Any: if "extra" in kwargs: From 1b46d6c2577c0b7c21d2c8c4ae786911be27a9cc Mon Sep 17 00:00:00 2001 From: jchmura Date: Thu, 30 Jul 2026 16:07:11 +0000 Subject: [PATCH 3/3] Record log level to user --- gigl/common/logger.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/gigl/common/logger.py b/gigl/common/logger.py index a8ffa8b41..67184b7e2 100644 --- a/gigl/common/logger.py +++ b/gigl/common/logger.py @@ -21,6 +21,8 @@ class Logger(logging.LoggerAdapter): extra (Optional[dict[str, Any]]): Extra information to be added to the log message. """ + _DID_ALERT_FOR_LOG_LEVEL: bool = False + def __init__( self, logger: Optional[logging.Logger] = None, @@ -28,22 +30,32 @@ def __init__( log_to_file: bool = False, extra: Optional[dict[str, Any]] = None, ): + gigl_debug = is_env_flag_enabled(GIGL_DEBUG) + if gigl_debug: + log_level = logging.DEBUG + else: + log_level = logging.INFO + if logger is None: logger = logging.getLogger(name) - self._setup_logger(logger, name, log_to_file) + self._setup_logger(logger, name, log_to_file, log_level) super().__init__(logger, extra or {}) + if not Logger._DID_ALERT_FOR_LOG_LEVEL: + Logger._DID_ALERT_FOR_LOG_LEVEL = True + level_name = logging.getLevelName(log_level) + self.info(f"{GIGL_DEBUG}={gigl_debug}, using log level {level_name}") + def _setup_logger( - self, logger: logging.Logger, name: Optional[str], log_to_file: bool + self, + logger: logging.Logger, + name: Optional[str], + log_to_file: bool, + log_level: int, ) -> None: handler: logging.Handler if not logger.handlers: - if is_env_flag_enabled(GIGL_DEBUG): - log_level = logging.DEBUG - else: - log_level = logging.INFO - if os.getenv("GAE_APPLICATION") or os.environ.get( "KUBERNETES_SERVICE_HOST" ):