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 2      csrd.logging · csrd.auth · csrd.delegate · csrd.repository · csrd.service
Tier 3      csrd.versioning

csrd.logging depends only on csrd.context — it sits at the low end of Tier 2.

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

Uploaded Python 3

File details

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

File metadata

  • Download URL: csrd_logging-0.3.38.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.38.tar.gz
Algorithm Hash digest
SHA256 ca03f92d73ed1f06fe286f604de1bb9e43b22895172d587962d013de1793bf7c
MD5 957e503124d355d2922483a20bbced02
BLAKE2b-256 1b20ecfca7bcb829092870401ed9a1fbf2ddfdf9dce905a5595ddee12bd21b8c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: csrd_logging-0.3.38-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.38-py3-none-any.whl
Algorithm Hash digest
SHA256 e7e168ca6c1dd14559bb6cbc40ba11bd3f52f9b2d39533605fff6c0d1561df77
MD5 7721cf4340f8a3dcdd8f3e40815b46af
BLAKE2b-256 833e7c935a09c09431c0a3147fa43add46395c55755ceae778f1bc9b23a84724

See more details on using hashes here.

Provenance

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