From 7919151966594558c1ecbd7d2e2a587e1944b126 Mon Sep 17 00:00:00 2001 From: Rob Nagler <5495179+robnagler@users.noreply.github.com> Date: Tue, 21 Apr 2026 19:56:21 +0000 Subject: [PATCH] log color controlled by rich - allows user to override color mode --- api/pyproject.toml | 2 +- api/src/damnit_api/_logging.py | 31 ++++++++++++++----------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/api/pyproject.toml b/api/pyproject.toml index 734d2036..67783959 100644 --- a/api/pyproject.toml +++ b/api/pyproject.toml @@ -31,6 +31,7 @@ dependencies = [ "requests~=2.32", "structlog~=24.4", "colorama~=0.4", + "rich>=14.2.0", "xarray>=2024.11", # uses datever "damnit~=0.2.1", "aiohttp~=3.11", @@ -55,7 +56,6 @@ docs = [ develop = [ "datamodel-code-generator[http]>=0.35.0", "pre-commit>=4.5.1", - "rich>=14.2.0", "strawberry-graphql[debug-server]>=0.283.3", ] dev = [ diff --git a/api/src/damnit_api/_logging.py b/api/src/damnit_api/_logging.py index c47dfca6..0c1a506b 100644 --- a/api/src/damnit_api/_logging.py +++ b/api/src/damnit_api/_logging.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING import colorama +import rich.console import structlog import structlog.typing import ulid @@ -74,31 +75,27 @@ def configure( from .shared.settings import settings + def _render_kwargs() -> dict: + rv = dict( + colors=rich.console.Console().color_system is not None, + exception_formatter=RichTracebackFormatter(max_frames=1), + level_styles=None, + sort_keys=False, + ) + if rv["colors"]: + rv["level_styles"] = structlog.dev.ConsoleRenderer.get_default_level_styles() + rv["level_styles"]["debug"] = colorama.Fore.MAGENTA + return rv + debug = settings.debug if debug is None else debug level = settings.log_level if level is None else level if isinstance(level, str): level = logging.getLevelNamesMapping()[level.upper()] - level_styles = structlog.dev.ConsoleRenderer.get_default_level_styles() - - if debug: - level_styles["debug"] = colorama.Fore.MAGENTA - if debug: - try: - import rich as _ # noqa: F401 - - exception_formatter = RichTracebackFormatter(max_frames=1) - except Exception: - # Fall back to plain traceback if `rich` isn't installed or import fails - exception_formatter = structlog.dev.plain_traceback # type: ignore[attr-defined] - renderer: structlog.typing.Processor = structlog.dev.ConsoleRenderer( - colors=True, - level_styles=level_styles, - sort_keys=False, - exception_formatter=exception_formatter, + **_render_kwargs() ) # type: ignore[assignment] else: renderer = structlog.processors.JSONRenderer(indent=1)