mirror of
https://github.com/tokio-rs/tracing.git
synced 2025-09-29 22:10:38 +00:00

## Motivation As discussed in #308, there are a large number of crates in this repository, which can be confusing for users and can increase the maintainance burden for maintainers. Also, the `tracing-fmt` and `tracing-subscriber` crates both contain filtering implementations with similar behaviour and APIs, but `tracing-subscriber`'s filter module offers more advanced features (filtering on field values), and is usable with any subscriber implementation. Two separate filter implementations also has the potential to be confusing for users. ## Solution This branch moves most of the code from `tracing-fmt` into a module in `tracing-subscriber`, and changes the `tracing-fmt` builder APIs to use the `Filter` type in `tracing-subscriber`. The `tracing-subscriber/fmt` feature flag can be used to disable the formatting subscriber when it is not used. The `tracing-fmt` crate has been updated to re-export the APIs from `tracing-subscriber`, and marked as deprecated. Once we've published a new version of `tracing-subscriber` with the format APIs, we can publish a final release of `tracing-fmt` that will update the documentation & mark all APIs as deprecated, so that users know to move to the `tracing-subscriber` crate. Refs: #308 Signed-off-by: Eliza Weisman <eliza@buoyant.io>
93 lines
2.1 KiB
Rust
93 lines
2.1 KiB
Rust
#![deny(rust_2018_idioms)]
|
|
use tracing::{debug, error, info, span, trace, warn, Level};
|
|
|
|
use std::{error::Error, fmt};
|
|
|
|
#[tracing::instrument]
|
|
pub fn shave(yak: usize) -> Result<(), Box<dyn Error + 'static>> {
|
|
debug!(
|
|
message = "hello! I'm gonna shave a yak.",
|
|
excitement = "yay!"
|
|
);
|
|
if yak == 3 {
|
|
warn!(target: "yak_events", "could not locate yak!");
|
|
Err(ShaveError::new(yak, YakError::new("could not locate yak")))?;
|
|
} else {
|
|
trace!(target: "yak_events", "yak shaved successfully");
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
pub fn shave_all(yaks: usize) -> usize {
|
|
let span = span!(Level::TRACE, "shaving_yaks", yaks_to_shave = yaks);
|
|
let _enter = span.enter();
|
|
|
|
info!("shaving yaks");
|
|
|
|
let mut num_shaved = 0;
|
|
for yak in 1..=yaks {
|
|
let res = shave(yak);
|
|
trace!(target: "yak_events", yak, shaved = res.is_ok());
|
|
|
|
if let Err(ref error) = res {
|
|
error!(
|
|
message = "failed to shave yak!",
|
|
yak,
|
|
error = error.as_ref()
|
|
);
|
|
} else {
|
|
num_shaved += 1;
|
|
}
|
|
|
|
trace!(target: "yak_events", yaks_shaved = num_shaved);
|
|
}
|
|
|
|
num_shaved
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
struct ShaveError {
|
|
source: Box<dyn Error + 'static>,
|
|
yak: usize,
|
|
}
|
|
|
|
impl fmt::Display for ShaveError {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "shaving yak #{} failed!", self.yak)
|
|
}
|
|
}
|
|
|
|
impl Error for ShaveError {
|
|
fn source(&self) -> Option<&(dyn Error + 'static)> {
|
|
Some(self.source.as_ref())
|
|
}
|
|
}
|
|
|
|
impl ShaveError {
|
|
fn new(yak: usize, source: impl Into<Box<dyn Error + 'static>>) -> Self {
|
|
Self {
|
|
source: source.into(),
|
|
yak,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
struct YakError {
|
|
description: &'static str,
|
|
}
|
|
|
|
impl fmt::Display for YakError {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{}", self.description)
|
|
}
|
|
}
|
|
|
|
impl Error for YakError {}
|
|
|
|
impl YakError {
|
|
fn new(description: &'static str) -> Self {
|
|
Self { description }
|
|
}
|
|
}
|