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.14.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.14-py3-none-any.whl (6.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: csrd_logging-0.3.14.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.14.tar.gz
Algorithm Hash digest
SHA256 d281e5753cf9e29bdec1ab437237e30cde6e1622b118b26a7991a15f6bc804b6
MD5 bc349ac9b5b1581bd996fd915f044467
BLAKE2b-256 9ed090d1cef5a2647ce1d6ed18291d4a2c8361c6f01fa33e60ae4484b68a137e

See more details on using hashes here.

Provenance

The following attestation bundles were made for csrd_logging-0.3.14.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.14-py3-none-any.whl.

File metadata

  • Download URL: csrd_logging-0.3.14-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.14-py3-none-any.whl
Algorithm Hash digest
SHA256 930bbc564d06e52a760a8b20092e79f9e869b61b7f231047d6384f3480f79df0
MD5 a4604426365d07122ce5c6321b33325d
BLAKE2b-256 6d1879276153683e914372bff4a871a5cc94417bd1155a487b74d47dd4e8a9b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for csrd_logging-0.3.14-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