Skip to main content

Production-grade logs interceptor for Python with Loki transport, resilience, batching, and framework integrations.

Project description

elven-logs-interceptor-python

High-performance, production-ready log interceptor for Python with Loki transport, batching, compression, circuit breaker, DLQ, and framework integrations.

Installation

pip install elven-logs-interceptor-python

With all extras:

pip install "elven-logs-interceptor-python[all]"

Quick Start

from logs_interceptor import init, logger

init(
    {
        "appName": "billing-service",
        "interceptConsole": True,
        "transport": {
            "url": "https://loki.example.com/loki/api/v1/push",
            "tenantId": "tenant-a",
            "authToken": "token",
            "compression": "gzip",
        },
    }
)

logger.info("service started", {"port": 3000})

Logging compatibility

The logger accepts both the Elven structured style and common Python logging call patterns. This makes migration safer when legacy code replaces logging.getLogger(__name__) with the Elven proxy.

logger.info("payload created", {"request_id": "req-1"})
logger.info("payload created: %s", payload)
logger.info("payload created: %(id)s", {"id": payload_id})
logger.info("payload created: {}", payload_id)
logger.info("payload created: %s", payload_id, extra={"request_id": "req-1"})
logger.exception("failed to create payload: %s", payload_id)

When intercepting the standard Python logging module, extra={...} is captured under context.extra:

logging.getLogger(__name__).info(
    "payload created",
    extra={"payload": payload},
)

Supported aliases: warning(...), exception(...) and critical(...).

Sensitive fields such as cpf, password, token and authorization are redacted by default. Set LOGS_FILTER_SANITIZE=false only when raw sensitive data is explicitly required and approved.

Environment Variables

The package supports the Python LOGS_* configuration surface aligned with the JS v3 design where applicable.

Required for direct Loki mode:

  • LOGS_URL
  • LOGS_TENANT
  • LOGS_APP_NAME

For collector-first mode, set LOGS_EXPORTER=otlp (or collector) and use OTEL_EXPORTER_OTLP_LOGS_ENDPOINT. In this mode LOGS_URL, LOKI_URL, LOGS_TENANT and LOGS_TOKEN are not required by the library. LOGS_URL is intentionally ignored in collector mode to avoid accidentally posting OTLP logs to a direct Loki /loki/api/v1/push endpoint. Put tenant or auth headers in OTEL_EXPORTER_OTLP_HEADERS/LOGS_OTLP_HEADERS if your collector gateway requires them.

Core:

  • LOGS_TOKEN
  • LOGS_APP_VERSION
  • LOGS_ENVIRONMENT

Transport:

  • LOGS_EXPORTER (loki|otlp, aliases: collector, otel)
  • OTEL_EXPORTER_OTLP_LOGS_ENDPOINT (collector logs endpoint, e.g. http://collector:4318/v1/logs)
  • LOGS_OTLP_HEADERS (comma-separated headers, e.g. x-tenant=team-a)
  • LOGS_COMPRESSION (none|gzip|brotli|snappy)
  • LOGS_COMPRESSION_LEVEL
  • LOGS_COMPRESSION_THRESHOLD
  • LOGS_USE_WORKERS
  • LOGS_MAX_WORKERS
  • LOGS_WORKER_TIMEOUT
  • LOGS_CONNECTION_POOLING
  • LOGS_MAX_SOCKETS
  • LOGS_ENABLE_STRUCTURED_METADATA (false by default; enable only when Loki allows limits_config.allow_structured_metadata)
  • LOGS_TIMEOUT
  • LOGS_MAX_RETRIES
  • LOGS_RETRY_DELAY

Buffer:

  • LOGS_BUFFER_MAX_SIZE
  • LOGS_BUFFER_FLUSH_INTERVAL
  • LOGS_BUFFER_MAX_MEMORY_MB
  • LOGS_BUFFER_MAX_AGE
  • LOGS_BUFFER_AUTO_FLUSH

Filter:

  • LOGS_FILTER_LEVELS
  • LOGS_FILTER_SAMPLING_RATE
  • LOGS_FILTER_SANITIZE
  • LOGS_FILTER_MAX_MESSAGE_LENGTH
  • LOGS_FILTER_EXCLUDE_LOGGER_PREFIXES (comma-separated)

Circuit Breaker:

  • LOGS_CIRCUIT_BREAKER_ENABLED
  • LOGS_CIRCUIT_BREAKER_FAILURE_THRESHOLD
  • LOGS_CIRCUIT_BREAKER_RESET_TIMEOUT
  • LOGS_CIRCUIT_BREAKER_HALF_OPEN_REQUESTS

DLQ:

  • LOGS_DLQ_ENABLED
  • LOGS_DLQ_TYPE (memory|file)
  • LOGS_DLQ_MAX_SIZE
  • LOGS_DLQ_MAX_RETRIES
  • LOGS_DLQ_BASE_PATH

Runtime:

  • LOGS_MAX_CONCURRENT_FLUSHES
  • LOGS_INTERCEPT_CONSOLE
  • LOGS_PRESERVE_ORIGINAL_CONSOLE
  • LOGS_ENABLE_METRICS
  • LOGS_ENABLE_HEALTH_CHECK
  • LOGS_DEBUG
  • LOGS_SILENT_ERRORS
  • LOGS_ENABLED
  • LOGS_AUTO_INIT
  • LOGS_ENABLE_EXPERIMENTAL_PROTOBUF (optional, enables experimental snappy/protobuf transport path)

Labels:

  • Prefix LOGS_LABEL_* (example: LOGS_LABEL_SERVICE=billing)

Public API

  • init(config)
  • get_logger()
  • is_initialized()
  • destroy()
  • adestroy()
  • logger proxy with debug/info/warn/warning/error/exception/fatal/critical/log/track_event/flush/aflush/get_metrics/get_health/destroy/adestroy/with_context/with_context_async

Python import remains:

import logs_interceptor

Integrations

  • Python logging (LoggingHandler)
  • FastAPI / Starlette (FastAPIMiddleware)
  • Django (DjangoMiddleware)
  • Flask (FlaskExtension)
  • Celery (CelerySignals)
  • structlog (StructlogProcessor)
  • loguru (LoguruSink)

Auto Init

Set LOGS_AUTO_INIT=true and import the package.

Preload mode:

python -m logs_interceptor.preload

Development

pip install -e ".[dev]"
ruff check .
mypy src
pytest

Deploy / Publish

Local publish script:

./scripts/publish.sh --repository testpypi --dry-run
./scripts/publish.sh --repository testpypi
./scripts/publish.sh --repository pypi

Token environment variables used by default:

  • TEST_PYPI_API_TOKEN for --repository testpypi
  • PYPI_API_TOKEN for --repository pypi

Optional script flags:

  • --skip-checks (skip lint/type/test)
  • --skip-build (skip build/twine check)
  • --token-env CUSTOM_VAR (custom token env var name)
  • --no-skip-existing (upload fails if version already exists)

Makefile shortcuts:

make qa
make publish-dry-run
make publish-testpypi
make publish-pypi

GitHub Actions publish workflow:

  • File: .github/workflows/publish.yml
  • Trigger: manual (workflow_dispatch)
  • Inputs: repository = testpypi | pypi
  • Required secrets:
    • TEST_PYPI_API_TOKEN
    • PYPI_API_TOKEN

License

MIT

Project details


Download files

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

Source Distribution

elven_logs_interceptor_python-0.1.14.tar.gz (41.5 kB view details)

Uploaded Source

Built Distribution

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

elven_logs_interceptor_python-0.1.14-py3-none-any.whl (66.2 kB view details)

Uploaded Python 3

File details

Details for the file elven_logs_interceptor_python-0.1.14.tar.gz.

File metadata

File hashes

Hashes for elven_logs_interceptor_python-0.1.14.tar.gz
Algorithm Hash digest
SHA256 5553612e1a00d4251a6e2732d341e5aeb3b24d61c7d50f65479898b863c9773d
MD5 1aeaa2f94ea108b80fc103dfd02e0afb
BLAKE2b-256 d6ebbc0f5e0e55238458a9254928cd1eba816d5bc8e09c69dd2deb98c0a1f304

See more details on using hashes here.

File details

Details for the file elven_logs_interceptor_python-0.1.14-py3-none-any.whl.

File metadata

File hashes

Hashes for elven_logs_interceptor_python-0.1.14-py3-none-any.whl
Algorithm Hash digest
SHA256 2cbfd0a61903dd8912cf6205af2970ef791a693577b8dfa507b5bc9c81442bdb
MD5 2bbcb8237dc859430ca7d816fda88991
BLAKE2b-256 30ad78e386e13801d755e4e142d0ea8d9a11fcd6760f05556039e94b6fd102e4

See more details on using hashes here.

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