1
0
mirror of https://github.com/actix/actix-extras.git synced 2025-02-22 18:33:18 +01:00
actix-extras/README.md

87 lines
2.8 KiB
Markdown
Raw Normal View History

2020-09-27 16:27:51 +01:00
<h1 align="center">tracing-actix-web</h1>
<div align="center">
<strong>
Structured logging for actix-web applications.
</strong>
</div>
2020-09-27 16:29:00 +01:00
<br/>
2020-09-27 16:27:51 +01:00
`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:
```toml
[dependencies]
# ...
2020-09-27 16:46:31 +01:00
tracing-actix-web = "0.2"
2020-09-27 16:27:51 +01:00
```
If you are using [`cargo-edit`](https://github.com/killercup/cargo-edit), run
```bash
cargo add tracing-actix-web
```
2020-09-27 16:46:31 +01:00
`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`.
2020-09-27 16:27:51 +01:00
## Usage example
Register `TracingLogger` as a middleware for your application using `.wrap` on `App`.
Add a `Subscriber` implementation to output logs to the console.
```rust
use actix_web::middleware::Logger;
use actix_web::App;
use tracing::{Subscriber, subscriber::set_global_default};
use tracing_log::LogTracer;
2020-09-27 16:27:51 +01:00
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);
}
```
[`TracingLogger`]: https://docs.rs/tracing-actix-web/0.2.1/tracing_actix_web/struct.TracingLogger.html
2020-09-27 16:27:51 +01:00
[`actix-web`]: https://docs.rs/actix-web
2020-09-27 16:46:31 +01:00
[`Logger`]: https://docs.rs/actix-web/3.0.0/actix_web/middleware/struct.Logger.html
2020-09-27 16:27:51 +01:00
[`log`]: https://docs.rs/log
[`tracing`]: https://docs.rs/tracing