Skip to main content

Context-enriched logging mixin with optional auto-instrumentation

Project description

csrd.logging

Context-enriched logging for all application layers.

Dependency tier

Tier 1        csrd.models · csrd.lifespan · csrd.context
Tier 1.5      csrd.logging  ← depends on csrd.context only
Tier 2        csrd.delegate · csrd.repository · csrd.service
Tier 3        csrd.versioning

Components

ContextLogger

A stdlib Logger wrapper that auto-enriches every message with request context (hit_id, user_id, path params) as key=value pairs.

from csrd.logging import ContextLogger

logger = ContextLogger(logging.getLogger(__name__))
logger.info("Order created", meta={"order_id": 42})
# → "Order created hit_id=abc-123 user_id=user1 order_id=42"

All standard logging kwargs (exc_info, extra, stacklevel) pass through. The meta kwarg adds extra key=value pairs per call.

LoggingMixin

A mixin providing self.log (a ContextLogger) for any class. Works at every layer.

from csrd.logging import LoggingMixin

class OrderService(BaseService, LoggingMixin):
    async def place_order(self, cart):
        self.log.info("Placing order", meta={"items": len(cart)})

Auto-logging (opt-in)

Pass auto_log=True to automatically log entry and exceptions for every public method:

class OrderService(BaseService, LoggingMixin, auto_log=True):
    async def place_order(self, cart):  # ← entry logged at INFO, exceptions at ERROR
        ...

Exclude noisy methods:

class MyService(BaseService, LoggingMixin, auto_log=True):
    __log_exclude__ = {"health_check"}

Both sync and async methods are handled. Private methods (_name) are always skipped.

RequestContextFilter

A stdlib logging.Filter that injects context fields into log records (not messages). Use this when your logging backend (Splunk, ELK, Datadog) needs structured fields in a configurable format.

Fields added to each record:

Field Source Default
hit_id Request trace ID "-"
user_id Authenticated user's sub claim "-"
app_id Application identifier header "-"
api_version Resolved API version "-"

Production logging configuration

ContextLogger enriches log messages — it works out of the box with zero configuration. For production deployments you'll typically also want to configure stdlib logging with structured formatters, handlers, and filters.

Approach 1: ContextLogger only (simplest)

No configuration needed. Messages include context automatically:

2025-07-15 10:23:45 INFO  Order created hit_id=abc-123 user_id=user1 order_id=42

Good for development and simple deployments.

Approach 2: YAML logging configuration (production)

Create a config/logging.yml in your application:

version: 1
disable_existing_loggers: false

formatters:
  structured:
    style: "{"
    format: "{asctime} hitId={hit_id} userId={user_id} module={name} func={funcName} level={levelname} {message}"

filters:
  context:
    "()": csrd.logging.RequestContextFilter

handlers:
  console:
    class: logging.StreamHandler
    level: INFO
    formatter: structured
    stream: ext://sys.stdout
    filters: [context]

loggers:
  uvicorn:
    handlers: [console]
    level: INFO
    propagate: false
  uvicorn.access:
    handlers: [console]
    level: INFO
    propagate: false
  root:
    level: INFO
    handlers: [console]

Load it at startup:

import logging.config
import yaml
from pathlib import Path

with open(Path("config/logging.yml")) as f:
    logging.config.dictConfig(yaml.safe_load(f))

Approach 3: Both together (recommended for production)

Use ContextLogger / LoggingMixin in your code for dev-friendly messages, and attach RequestContextFilter to your production handlers for structured logging backends. The two are complementary — ContextLogger enriches the message text, RequestContextFilter adds record-level fields for formatters.

When to use which

Approach Context in logs Config required Best for
ContextLogger In message text (key=value) None Dev, simple apps
logging.yml + RequestContextFilter In log record fields YAML file Splunk, ELK, structured logging
Both together Both YAML file Full production setup

Installation

uv add csrd-logging

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

csrd_logging-0.3.19.tar.gz (8.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

csrd_logging-0.3.19-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

Details for the file csrd_logging-0.3.19.tar.gz.

File metadata

  • Download URL: csrd_logging-0.3.19.tar.gz
  • Upload date:
  • Size: 8.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csrd_logging-0.3.19.tar.gz
Algorithm Hash digest
SHA256 4381dee658b5341336e393275c47922e8ca937d30eefd03cf85e57f9e792fec8
MD5 012686b9f2cad76be9388a178ea52b4c
BLAKE2b-256 1460818d8626ccb104babd93d47bfd317f92d0cdee75e2147aee14541b9ba542

See more details on using hashes here.

Provenance

The following attestation bundles were made for csrd_logging-0.3.19.tar.gz:

Publisher: release.yml on csrd-api/fastapi-common

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file csrd_logging-0.3.19-py3-none-any.whl.

File metadata

  • Download URL: csrd_logging-0.3.19-py3-none-any.whl
  • Upload date:
  • Size: 6.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for csrd_logging-0.3.19-py3-none-any.whl
Algorithm Hash digest
SHA256 7c42bc611eb4461c2fb5010070bd7b656f357d51d5bc15d9e27a6116aa938c8d
MD5 b9737bece57dfec8abed3e31c58dfde2
BLAKE2b-256 2fc85f427c8dd36e9c30ed78ed33fa504ab085916b3b8f92354911d8eb2bf503

See more details on using hashes here.

Provenance

The following attestation bundles were made for csrd_logging-0.3.19-py3-none-any.whl:

Publisher: release.yml on csrd-api/fastapi-common

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page