Dead simple loguru setup
Project description
loguru-kit
Safe & extensible loguru setup with conflict-free isolation.
Language: 한국어 | English
Features
- Conflict-free: No
logger.remove()- safe to use alongside other loguru users - Isolated loggers: Each module gets its own context via
logger.bind() - Extensible: Handler, Formatter, ContextProvider protocols
- Async-safe: contextvars-based context propagation
- Integrations: FastAPI middleware, OpenTelemetry, stdlib intercept
Installation
pip install loguru-kit
Quick Start
from loguru_kit import setup, get_logger
# Initialize once at app startup
setup()
# Get isolated logger for your module
logger = get_logger(__name__)
logger.info("Hello, world!")
Configuration
Via Code
from loguru_kit import setup, ConsoleHandler, JsonFormatter
setup(
level="DEBUG",
handlers=[
ConsoleHandler(level="INFO"),
],
formatters=[
JsonFormatter(),
],
)
Via Environment Variables
| Variable | Default | Description |
|---|---|---|
LOGURU_KIT_LEVEL |
INFO |
Log level |
LOGURU_KIT_JSON |
false |
JSON output |
Priority: code args > env vars > defaults
Extension System
Custom Handler
from loguru_kit import Handler, setup
class SlackHandler:
"""Send critical logs to Slack."""
def __call__(self, message) -> None:
if message.record["level"].name == "CRITICAL":
send_to_slack(str(message))
setup(handlers=[SlackHandler()])
Custom Formatter
from loguru_kit import Formatter, setup
class CompactFormatter:
"""Minimal log format."""
def __call__(self, record: dict) -> str:
return "{level}: {message}\n"
setup(formatters=[CompactFormatter()])
Custom Context Provider
from loguru_kit import ContextProvider, setup
class UserProvider:
"""Inject current user into logs."""
def __call__(self) -> dict:
return {"user_id": get_current_user_id()}
setup(context_providers=[UserProvider()])
Integrations
FastAPI
pip install loguru-kit[fastapi]
from fastapi import FastAPI
from loguru_kit import setup, get_logger
from loguru_kit.integrations.fastapi import LoggingMiddleware
setup()
logger = get_logger(__name__)
app = FastAPI()
app.add_middleware(LoggingMiddleware)
@app.get("/")
async def root():
logger.info("processing request")
return {"status": "ok"}
Request ID is automatically injected into all logs within a request context.
OpenTelemetry
pip install loguru-kit[otel]
from loguru_kit import setup
from loguru_kit.integrations.otel import patch_loguru
setup()
patch_loguru()
# trace_id, span_id automatically injected into logs
stdlib Logging Intercept
Selectively intercept stdlib loggers (e.g., from third-party libraries):
from loguru_kit import setup
from loguru_kit.integrations.stdlib import intercept_stdlib
setup()
intercept_stdlib(loggers=["uvicorn", "sqlalchemy"])
# Only specified loggers are redirected to loguru
Migration from v1
Breaking Changes
| v1 | v2 |
|---|---|
from loguru_kit import logger |
from loguru_kit import get_logger; logger = get_logger(__name__) |
LOGURU_* env vars |
LOGURU_KIT_* env vars |
setup(intercept=True) |
intercept_stdlib(loggers=[...]) (explicit) |
setup(otel=True) |
patch_loguru() (explicit) |
Migration Steps
- Replace
loggerimport withget_logger(__name__) - Update environment variables from
LOGURU_*toLOGURU_KIT_* - Use explicit
intercept_stdlib()instead ofintercept=True - Use explicit
patch_loguru()instead ofotel=True
Before (v1)
from loguru_kit import setup, logger
setup(level="DEBUG", intercept=True, otel=True)
logger.info("Hello!")
After (v2)
from loguru_kit import setup, get_logger
from loguru_kit.integrations.stdlib import intercept_stdlib
from loguru_kit.integrations.otel import patch_loguru
setup(level="DEBUG")
intercept_stdlib(loggers=["uvicorn"])
patch_loguru()
logger = get_logger(__name__)
logger.info("Hello!")
Why v2?
v1 had a critical flaw: calling logger.remove() which pollutes global loguru state. This caused conflicts when:
- Multiple packages use loguru-kit
- Other packages use raw loguru
- stdlib logging handlers get hijacked
v2 uses logger.bind() for isolation - your loguru-kit usage never affects other loguru users.
License
MIT License - See LICENSE for details.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file loguru_kit-0.6.0.tar.gz.
File metadata
- Download URL: loguru_kit-0.6.0.tar.gz
- Upload date:
- Size: 54.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fbcbce2633eddcf3557542299adfc4d7778a3c964fd6d4ec064d1af5ec03085
|
|
| MD5 |
3b992e0e7819d4ba2e1f7bcc24785b99
|
|
| BLAKE2b-256 |
ba6444357802d94ba4e62dd2ebdf73295370730e198740252759e6ba009c4552
|
File details
Details for the file loguru_kit-0.6.0-py3-none-any.whl.
File metadata
- Download URL: loguru_kit-0.6.0-py3-none-any.whl
- Upload date:
- Size: 16.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
821885d86f600efdea4bf9984214e4cd067f60a6b3ac224f7f394ff072077799
|
|
| MD5 |
d3a0f5dde0d5c30d2684bf64a21bd76a
|
|
| BLAKE2b-256 |
da3070acb170b1012a65166bccefbbae193c2baa97881324b21bc07da559a5d7
|