Context Binding¶
Attach structured data to records without manual string formatting.
Best practice
Use bind() for request IDs, user IDs, and other metadata that should appear in every log.
Overview¶
bind()creates a new logger with permanent context.contextualize()adds temporary context in awithblock.patch()modifies records dynamically before they are emitted.
bind() - Permanent context¶
from logust import logger
user_logger = logger.bind(user_id="123", session="abc")
user_logger.info("User action")
With JSON output, extra fields are included:
{
"time": "2025-12-24T12:00:00",
"level": "INFO",
"message": "User action",
"extra": {
"user_id": "123",
"session": "abc"
}
}
contextualize() - Temporary context¶
from logust import logger
with logger.contextualize(request_id="abc"):
logger.info("Processing")
logger.info("Done")
logger.info("Outside")
Nested contexts¶
with logger.contextualize(user_id="123"):
logger.info("User context")
with logger.contextualize(action="login"):
logger.info("Both user_id and action")
logger.info("Only user_id")
patch() - Dynamic modification¶
from logust import logger
import threading
def add_thread_info(record):
record["extra"]["thread"] = threading.current_thread().name
patched_logger = logger.patch(add_thread_info)
patched_logger.info("Thread-aware log")
Chaining patchers¶
def add_request_id(record):
record["extra"]["request_id"] = get_current_request_id()
def add_user_id(record):
record["extra"]["user_id"] = get_current_user_id()
enhanced_logger = logger.patch(add_request_id).patch(add_user_id)
Use cases¶
Web request logging¶
from logust import logger
def handle_request(request):
req_logger = logger.bind(
request_id=request.id,
method=request.method,
path=request.path,
)
req_logger.info("Request started")
# ... process request ...
req_logger.info("Request completed")