context-logger

A lightweight, ergonomic library for adding structured context to your logs.
context-logger enhances the standard Rust log crate ecosystem by allowing
you to attach rich contextual information to your log messages without changing
your existing logging patterns.
Usage
Basic Example
Add context-logger to your Cargo.toml:
[dependencies]
context-logger = "0.1.0"
log = { version = "0.4", features = ["kv_serde"] }
env_logger = "0.10"
Then, you can use it in your code:
use context_logger::{ContextLogger, LogContext, LogContextExt as _};
use log::info;
fn main() {
let env_logger = env_logger::builder().build();
let max_level = env_logger.filter();
let context_logger = ContextLogger::new(env_logger)
.default_record("version", "1.0.0");
context_logger.init(max_level);
let context = LogContext::new()
.with_inherited_record("request_id", "req-123")
.with_local_record("user_id", 42);
context.in_scope(|| {
info!("Processing request"); })
}
Async Context Propagation
Context logger supports async functions and can propagate log context across
.await points.
use context_logger::{ContextLogger, LogContext, FutureExt, LogScope};
use log::info;
async fn process_user_data(user_id: &str) {
let context = LogContext::new().with_local_record("user_id", user_id);
async {
info!("Processing user data");
fetch_user_preferences().await;
info!("User data processed"); }
.in_log_context(context)
.await;
}
async fn fetch_user_preferences() {
LogScope::add_record("operation", "fetch_preferences");
info!("Fetching preferences"); }
async fn spawn_background_job(user_id: &str) {
let context = LogContext::new().with_local_record("user_id", user_id);
async {
let context = LogScope::current_context();
tokio::spawn(
async move {
info!("Running background job"); }
.in_log_context(context),
)
.await
.unwrap();
}
.in_log_context(context)
.await;
}
License
This project is licensed under the MIT License. See the LICENSE file for
details.