fix missing tracing-log import in Readme
tracing-actix-web
tracing-actix-web
provides TracingLogger
, a middleware to log request and response info when using the actix-web
framework.
TracingLogger
is designed as a drop-in replacement of actix-web
's Logger
.
Logger
is built on top of the log
crate: you need to use regular expressions to parse the request information out of the logged message.
TracingLogger
relies on tracing
, a modern instrumentation framework for structured logging: all request information is captured as a machine-parsable set of key-value pairs.
It also enables propagation of context information to children spans.
How to install
Add tracing-actix-web
to your dependencies:
[dependencies]
# ...
tracing-actix-web = "0.2"
If you are using cargo-edit
, run
cargo add tracing-actix-web
tracing-actix-web
0.2.x
depends on actix-web
3.x.x
.
If you are using actix-web
2.x.x
use tracing-actix-web
0.1.x
.
Usage example
Register TracingLogger
as a middleware for your application using .wrap
on App
.
Add a Subscriber
implementation to output logs to the console.
use actix_web::middleware::Logger;
use actix_web::App;
use tracing::{Subscriber, subscriber::set_global_default};
use tracing_log::LogTracer;
use tracing_actix_web::TracingLogger;
use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
/// Compose multiple layers into a `tracing`'s subscriber.
pub fn get_subscriber(
name: String,
env_filter: String
) -> impl Subscriber + Send + Sync {
let env_filter = EnvFilter::try_from_default_env()
.unwrap_or(EnvFilter::new(env_filter));
let formatting_layer = BunyanFormattingLayer::new(
name.into(),
std::io::stdout
);
Registry::default()
.with(env_filter)
.with(JsonStorageLayer)
.with(formatting_layer)
}
/// Register a subscriber as global default to process span data.
///
/// It should only be called once!
pub fn init_subscriber(subscriber: impl Subscriber + Send + Sync) {
LogTracer::init().expect("Failed to set logger");
set_global_default(subscriber).expect("Failed to set subscriber");
}
fn main() {
let subscriber = get_subscriber("app".into(), "info".into());
init_subscriber(subscriber);
let app = App::new().wrap(TracingLogger);
}