Skip to main content

🐱 Lynx Logger

The all-in-one structured logging solution for modern Python applications.

Built on top of structlog. Designed for FastAPI, Flask, Django, and production scripts.

PyPI Version Python Versions License Downloads

Features • Installation • Quick Start • Configuration • Integrations


🚀 Features

Lynx Logger bridges the gap between simple print debugging and complex enterprise logging systems.

  • ✨ Zero-Config Start: Get beautiful logs with a single line of code.
  • 📦 Structured & JSON: Native JSON support for ELK Stack, Datadog, or Loki.
  • 🔍 Context-Aware: Automatic tracing of request_id, user_id, and trace contexts across your app.
  • 🛡 Smart Filtering: Built-in filters for PII (GDPR compliance), log levels, and sources.
  • 📂 File Rotation: Robust file handling with size limits and backups out of the box.
  • 🔌 Framework Ready: Middleware included for FastAPI, Flask, and Django.

📦 Installation

pip install lynx-logger

Optional Dependencies:

Extra Use Case
lynx-logger[web] Optimized for web frameworks (FastAPI, Starlette, Flask, Django)
lynx-logger[all] Installs all dependencies including dev tools

⚡ Quick Start

1. Basic Usage (Development)

Perfect for local development with readable, colored output.

from lynx_logger import setup_logger

logger = setup_logger("my_service")

logger.info("Service started", version="1.0.0")
logger.warning("Cache miss", key="user:123", latency_ms=45)
# Output: 2025-02-05 [INFO] my_service: Service started version=1.0.0

2. Production Setup (JSON)

Optimized for log aggregators.

logger = setup_logger(
    name="payment_service",
    level="INFO", 
    format="json",          # Outputs strict JSON
    log_to_file=True,
    logs_dir="./logs"
)

logger.info("Transaction processed", amount=500, currency="USD", user_id=42)
# Output: {"timestamp": "...", "level": "info", "event": "Transaction processed", "amount": 500, ...}

🎨 Output Formats

Format Example Output Best For
Console [INFO] app: Server started port=8000 (Colored) Local Development
JSON {"ts": "...", "level": "info", "msg": "Server started"} Production / ELK
Key-Value level=info event='Server started' port=8000 Legacy Systems

🧠 Context Management

Stop passing user_id as an argument to every function. Lynx Logger handles context for you.

Automatic Context (Context Manager)

from lynx_logger import RequestContext

# Automatically injects request_id into every log within this block
with RequestContext(request_id="req_123", user_id="user_456"):
    logger.info("Querying database") 
    # Log includes: request_id="req_123" user_id="user_456"

Context Binding

# Create a logger instance bound to specific data
job_logger = logger.bind(job_id="job_999")

job_logger.info("Job started") 
job_logger.info("Job finished")
# Both logs will contain job_id="job_999"

🛡 Advanced Filtering

Throttling (Rate Limiting)

Prevent log flooding when errors occur in a loop.

from lynx_logger import ThrottleFilter

# Allow max 10 identical messages per minute
throttle = ThrottleFilter(max_repeats=10, time_window=60)

Content Filtering (GDPR/Security)

Automatically mask or exclude sensitive data.

from lynx_logger import ContentFilter, LogConfig, LynxLogger

config = LogConfig(
    name="app",
    filters=ContentFilter(
        exclude_patterns=["password", "secret_key", "auth_token"],
        case_sensitive=False
    )
)
logger = LynxLogger(config)

⚙️ Configuration

Lynx Logger follows the 12-Factor App methodology and can be configured via Environment Variables.

Environment Variable Default Description
LOG_NAME root Service name
LOG_LEVEL INFO Logging level (DEBUG, INFO, ERROR)
LOG_FORMAT console Output format: console, json, keyvalue
LOG_TO_FILE false Enable file logging
LOG_DIR ./logs Directory for log files

Or via Python Dictionary:

config = LogConfig.from_dict({
    "name": "worker",
    "level": "DEBUG",
    "file": {
        "filename": "worker.log",
        "max_size": "50MB",
        "backup_count": 5
    }
})

🔌 Integrations

FastAPI Middleware Example

from fastapi import FastAPI, Request
from lynx_logger import setup_logger, RequestContext
import uuid

app = FastAPI()
logger = setup_logger("api", format="json")

@app.middleware("http")
async def log_middleware(request: Request, call_next):
    req_id = request.headers.get("X-Request-ID", str(uuid.uuid4()))
    
    # Context is automatically cleared after the request finishes
    with RequestContext(request_id=req_id, path=request.url.path):
        logger.info("Request started")
        response = await call_next(request)
        logger.info("Request finished", status=response.status_code)
        return response

🤝 Contributing

Contributions are welcome!

  1. Fork the repository.

  2. Create your feature branch.

  3. Commit your changes.

  4. Open a Pull Request.

Please open an Issue for any bugs or feature requests.

📄 License

This project is licensed under the MIT License.

Developed with ❤️ by FlacSy

Metadata

Release files for lynx-logger 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lynx-logger 1.0.3
File Size Uploaded
lynx_logger-1.0.3.tar.gz 37.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lynx-logger 1.0.3
File Interpreter ABI Platform
lynx_logger-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 79.1 kB

Release files / lynx_logger-1.0.3.tar.gz

Download URL lynx_logger-1.0.3.tar.gz
Size 37.0 kB
Tags Source
SHA-256 checksum
How to use checksums
54f41b9c263186a475d1f1d49cd323794ddc47b143c506786bc378b7b1c197f1
BLAKE2b-256 checksum
How to use checksums
88a64849f9a7a7fcee4e0b8c7a5b72b96bfc91ed7536593f317972aaea8d649d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release files / lynx_logger-1.0.3-py3-none-any.whl

Download URL lynx_logger-1.0.3-py3-none-any.whl
Size 42.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d8981ed5e6ef00e2148eb4debf8511aac3c09ed918bab86a0e1087341244d648
BLAKE2b-256 checksum
How to use checksums
2e68765ff0920b95d714e4758196e8ef98a12b46c495fdc14a92cdf6c73bdeae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.2

1 release file

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page