3 Commits
Author SHA1 Message Date
mathias2784 0f819e649d black
Tests / test_and_lint (push) Successful in 14s
2026-10-18 10:23:53 +02:00
mathias2784 f24e628e5b version bump
Tests / test_and_lint (push) Failing after 13s
2026-10-18 10:22:29 +02:00
mathias2784 0880bdcafd set uvicorn log level to INFO to de-clutter application logs on DEGUG level 2026-10-18 10:21:48 +02:00
4 changed files with 22 additions and 3 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "utils" name = "utils"
version = "0.1.2" version = "0.1.3"
description = "Some hopefully useful utilities to use in everyday coding" description = "Some hopefully useful utilities to use in everyday coding"
readme = "README.md" readme = "README.md"
authors = [ authors = [
+4
View File
@@ -72,6 +72,10 @@ class LoggingSettings(BaseSettingsConfig):
root_logger = logging.getLogger() root_logger = logging.getLogger()
root_logger.setLevel(level) root_logger.setLevel(level)
# Keep Uvicorn's own debug output from following the application's level.
for logger_name in ("uvicorn", "uvicorn.error", "uvicorn.access"):
logging.getLogger(logger_name).setLevel(logging.INFO)
# Replace and close existing handlers to avoid duplicate output and resource leaks. # Replace and close existing handlers to avoid duplicate output and resource leaks.
for handler in root_logger.handlers[:]: for handler in root_logger.handlers[:]:
root_logger.removeHandler(handler) root_logger.removeHandler(handler)
+15
View File
@@ -13,6 +13,7 @@ from uvicorn.logging import DefaultFormatter
from utils.logging_config import LoggingSettings from utils.logging_config import LoggingSettings
SECONDS_PER_DAY = 24 * 60 * 60 SECONDS_PER_DAY = 24 * 60 * 60
UVICORN_LOGGER_NAMES = ("uvicorn", "uvicorn.error", "uvicorn.access")
@pytest.fixture @pytest.fixture
@@ -20,6 +21,8 @@ def restore_root_logger() -> Generator[None]:
root = logging.getLogger() root = logging.getLogger()
old_handlers = root.handlers[:] old_handlers = root.handlers[:]
old_level = root.level old_level = root.level
uvicorn_loggers = [logging.getLogger(name) for name in UVICORN_LOGGER_NAMES]
old_uvicorn_levels = [logger.level for logger in uvicorn_loggers]
for handler in old_handlers: for handler in old_handlers:
root.removeHandler(handler) root.removeHandler(handler)
@@ -32,6 +35,8 @@ def restore_root_logger() -> Generator[None]:
for handler in old_handlers: for handler in old_handlers:
root.addHandler(handler) root.addHandler(handler)
root.setLevel(old_level) root.setLevel(old_level)
for logger, level in zip(uvicorn_loggers, old_uvicorn_levels):
logger.setLevel(level)
def test_sets_valid_log_level(restore_root_logger: None) -> None: def test_sets_valid_log_level(restore_root_logger: None) -> None:
@@ -40,6 +45,16 @@ def test_sets_valid_log_level(restore_root_logger: None) -> None:
assert logging.getLogger().level == logging.DEBUG assert logging.getLogger().level == logging.DEBUG
def test_keeps_uvicorn_loggers_at_info_with_debug_root(
restore_root_logger: None,
) -> None:
LoggingSettings(LOG_LEVEL="DEBUG", LOG_TO_FILE=False)
assert all(
logging.getLogger(name).level == logging.INFO for name in UVICORN_LOGGER_NAMES
)
def test_invalid_log_level_falls_back_to_info(restore_root_logger: None) -> None: def test_invalid_log_level_falls_back_to_info(restore_root_logger: None) -> None:
with patch("utils.logging_config.logger.error") as log_error: with patch("utils.logging_config.logger.error") as log_error:
LoggingSettings(LOG_LEVEL="NOT_A_LEVEL", LOG_TO_FILE=False) LoggingSettings(LOG_LEVEL="NOT_A_LEVEL", LOG_TO_FILE=False)
Generated
+2 -2
View File
@@ -1,5 +1,5 @@
version = 1 version = 1
revision = 3 revision = 5
requires-python = ">=3.14" requires-python = ">=3.14"
[[package]] [[package]]
@@ -751,7 +751,7 @@ wheels = [
[[package]] [[package]]
name = "utils" name = "utils"
version = "0.1.1" version = "0.1.3"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "black" }, { name = "black" },