From e75605c6b106b26ccc1db74d7846a34c47502c91 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Tue, 25 Aug 2026 08:23:02 +0100 Subject: [PATCH 1/3] fix(logging): support warning and error log levels --- src/openai/_utils/_logs.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/openai/_utils/_logs.py b/src/openai/_utils/_logs.py index c2c92e62f4..70de7744cc 100644 --- a/src/openai/_utils/_logs.py +++ b/src/openai/_utils/_logs.py @@ -8,6 +8,13 @@ SENSITIVE_HEADERS = {"api-key", "authorization", "x-amz-security-token"} +LOG_LEVELS = { + "debug": logging.DEBUG, + "info": logging.INFO, + "warning": logging.WARNING, + "error": logging.ERROR, + "critical": logging.CRITICAL, +} def _basic_config() -> None: @@ -29,12 +36,9 @@ def setup_logging() -> None: # Transport loggers may include complete URLs. Leave their configuration to # the application instead of enabling them with the SDK's logging switch. env = os.environ.get("OPENAI_LOG") - if env == "debug": + if env in LOG_LEVELS: _basic_config() - logger.setLevel(logging.DEBUG) - elif env == "info": - _basic_config() - logger.setLevel(logging.INFO) + logger.setLevel(LOG_LEVELS[env]) # type: ignore[index] class SensitiveHeadersFilter(logging.Filter): @@ -45,4 +49,4 @@ def filter(self, record: logging.LogRecord) -> bool: for header in headers: if str(header).lower() in SENSITIVE_HEADERS: headers[header] = "" - return True + return True \ No newline at end of file From 8252d931cc14b86a524b53e7b410b57b23d567d9 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Tue, 25 Aug 2026 08:23:13 +0100 Subject: [PATCH 2/3] refactor(logging): map supported OPENAI_LOG levels --- src/openai/_utils/_logs.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/openai/_utils/_logs.py b/src/openai/_utils/_logs.py index 70de7744cc..baf81d228b 100644 --- a/src/openai/_utils/_logs.py +++ b/src/openai/_utils/_logs.py @@ -8,7 +8,7 @@ SENSITIVE_HEADERS = {"api-key", "authorization", "x-amz-security-token"} -LOG_LEVELS = { +_LOG_LEVELS = { "debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, @@ -36,9 +36,15 @@ def setup_logging() -> None: # Transport loggers may include complete URLs. Leave their configuration to # the application instead of enabling them with the SDK's logging switch. env = os.environ.get("OPENAI_LOG") - if env in LOG_LEVELS: - _basic_config() - logger.setLevel(LOG_LEVELS[env]) # type: ignore[index] + if env is None: + return + + level = _LOG_LEVELS.get(env) + if level is None: + return + + _basic_config() + logger.setLevel(level) class SensitiveHeadersFilter(logging.Filter): From 24e4f9bde1df0ab2241a67cdd52cd8d401d8e1a9 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Tue, 25 Aug 2026 08:23:25 +0100 Subject: [PATCH 3/3] test(logging): cover OPENAI_LOG standard levels --- tests/test_log_levels.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/test_log_levels.py diff --git a/tests/test_log_levels.py b/tests/test_log_levels.py new file mode 100644 index 0000000000..e36f7005e1 --- /dev/null +++ b/tests/test_log_levels.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +import logging + +import pytest + +from openai._utils._logs import setup_logging + + +@pytest.mark.parametrize( + ("setting", "expected_level"), + [ + ("debug", logging.DEBUG), + ("info", logging.INFO), + ("warning", logging.WARNING), + ("error", logging.ERROR), + ("critical", logging.CRITICAL), + ], +) +def test_openai_log_sets_standard_log_level( + setting: str, + expected_level: int, + monkeypatch: pytest.MonkeyPatch, +) -> None: + logger = logging.getLogger("openai") + original_level = logger.level + + try: + monkeypatch.setenv("OPENAI_LOG", setting) + setup_logging() + assert logger.level == expected_level + finally: + logger.setLevel(original_level)