diff --git a/tracing-subscriber/src/fmt/format/json.rs b/tracing-subscriber/src/fmt/format/json.rs index b44d0605ff..20292833d7 100644 --- a/tracing-subscriber/src/fmt/format/json.rs +++ b/tracing-subscriber/src/fmt/format/json.rs @@ -23,25 +23,42 @@ use tracing_serde::AsSerde; #[cfg(feature = "tracing-log")] use tracing_log::NormalizeEvent; -/// Marker for `Format` that indicates that the verbose JSON log format should be used. +/// Marker for [`Format`] that indicates that the newline-delimited JSON log +/// format should be used. /// -/// The full format includes fields from all entered spans. +/// This formatter is intended for production use with systems where structured +/// logs are consumed as JSON by analysis and viewing tools. The JSON output is +/// not optimized for human readability; instead, it should be pretty-printed +/// using external JSON tools such as `jq`, or using a JSON log viewer. /// /// # Example Output /// -/// ```json -/// { -/// "timestamp":"Feb 20 11:28:15.096", -/// "level":"INFO", -/// "fields":{"message":"some message","key":"value"} -/// "target":"mycrate", -/// "span":{name":"leaf"}, -/// "spans":[{"name":"root"},{"name":"leaf"}], -/// } -/// ``` +///
:; cargo run --example fmt-json
+///     Finished dev [unoptimized + debuginfo] target(s) in 0.08s
+///      Running `target/debug/examples/fmt-json`
+/// {"timestamp":"2022-02-15T18:47:10.821315Z","level":"INFO","fields":{"message":"preparing to shave yaks","number_of_yaks":3},"target":"fmt_json"}
+/// {"timestamp":"2022-02-15T18:47:10.821422Z","level":"INFO","fields":{"message":"shaving yaks"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821495Z","level":"TRACE","fields":{"message":"hello! I'm gonna shave a yak","excitement":"yay!"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":1,"name":"shave"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821546Z","level":"TRACE","fields":{"message":"yak shaved successfully"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":1,"name":"shave"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821598Z","level":"DEBUG","fields":{"yak":1,"shaved":true},"target":"yak_events","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821637Z","level":"TRACE","fields":{"yaks_shaved":1},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821684Z","level":"TRACE","fields":{"message":"hello! I'm gonna shave a yak","excitement":"yay!"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":2,"name":"shave"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821727Z","level":"TRACE","fields":{"message":"yak shaved successfully"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":2,"name":"shave"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821773Z","level":"DEBUG","fields":{"yak":2,"shaved":true},"target":"yak_events","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821806Z","level":"TRACE","fields":{"yaks_shaved":2},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821909Z","level":"TRACE","fields":{"message":"hello! I'm gonna shave a yak","excitement":"yay!"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":3,"name":"shave"}]}
+/// {"timestamp":"2022-02-15T18:47:10.821956Z","level":"WARN","fields":{"message":"could not locate yak"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":3,"name":"shave"}]}
+/// {"timestamp":"2022-02-15T18:47:10.822006Z","level":"DEBUG","fields":{"yak":3,"shaved":false},"target":"yak_events","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.822041Z","level":"ERROR","fields":{"message":"failed to shave yak","yak":3,"error":"missing yak"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.822079Z","level":"TRACE","fields":{"yaks_shaved":2},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
+/// {"timestamp":"2022-02-15T18:47:10.822117Z","level":"INFO","fields":{"message":"yak shaving completed","all_yaks_shaved":false},"target":"fmt_json"}
+/// 
/// /// # Options /// +/// This formatter exposes additional options to configure the structure of the +/// output JSON objects: +/// /// - [`Json::flatten_event`] can be used to enable flattening event fields into /// the root /// - [`Json::with_current_span`] can be used to control logging of the current diff --git a/tracing-subscriber/src/fmt/format/mod.rs b/tracing-subscriber/src/fmt/format/mod.rs index 878683c217..b98368b3f4 100644 --- a/tracing-subscriber/src/fmt/format/mod.rs +++ b/tracing-subscriber/src/fmt/format/mod.rs @@ -1,4 +1,33 @@ //! Formatters for logging `tracing` events. +//! +//! This module provides several formatter implementations, as well as utilities +//! for implementing custom formatters. +//! +//! # Formatters +//! This module provides a number of formatter implementations: +//! +//! * [`Full`]: The default formatter. This emits human-readable, +//! single-line logs for each event that occurs, with the current span context +//! displayed before the formatted representation of the event. See +//! [here](Full#example-output) for sample output. +//! +//! * [`Compact`]: A variant of the default formatter, optimized for +//! short line lengths. Fields from the current span context are appended to +//! the fields of the formatted event, and span names are not shown; the +//! verbosity level is abbreviated to a single character. See +//! [here](Compact#example-output) for sample output. +//! +//! * [`Pretty`]: Emits excessively pretty, multi-line logs, optimized +//! for human readability. This is primarily intended to be used in local +//! development and debugging, or for command-line applications, where +//! automated analysis and compact storage of logs is less of a priority than +//! readability and visual appeal. See [here](Pretty#example-output) +//! for sample output. +//! +//! * [`Json`]: Outputs newline-delimited JSON logs. This is intended +//! for production use with systems where structured logs are consumed as JSON +//! by analysis and viewing tools. The JSON output is not optimized for human +//! readability. See [here](Json#example-output) for sample output. use super::time::{FormatTime, SystemTime}; use crate::{ field::{MakeOutput, MakeVisitor, RecordFields, VisitFmt, VisitOutput}, @@ -302,13 +331,60 @@ pub struct FieldFnVisitor<'a, F> { /// The compact format includes fields from all currently entered spans, after /// the event's fields. Span names are listed in order before fields are /// displayed. +/// +/// # Example Output +/// +///
:; cargo run --example fmt-compact
+///     Finished dev [unoptimized + debuginfo] target(s) in 0.08s
+///      Running `target/debug/examples/fmt-compact`
+/// 2022-02-17T19:51:05.809287Z  INFO fmt_compact: preparing to shave yaks number_of_yaks=3
+/// 2022-02-17T19:51:05.809367Z  INFO shaving_yaks: fmt_compact::yak_shave: shaving yaks yaks=3
+/// 2022-02-17T19:51:05.809414Z TRACE shaving_yaks:shave: fmt_compact::yak_shave: hello! I'm gonna shave a yak excitement="yay!" yaks=3 yak=1
+/// 2022-02-17T19:51:05.809443Z TRACE shaving_yaks:shave: fmt_compact::yak_shave: yak shaved successfully yaks=3 yak=1
+/// 2022-02-17T19:51:05.809477Z DEBUG shaving_yaks: yak_events: yak=1 shaved=true yaks=3
+/// 2022-02-17T19:51:05.809500Z TRACE shaving_yaks: fmt_compact::yak_shave: yaks_shaved=1 yaks=3
+/// 2022-02-17T19:51:05.809531Z TRACE shaving_yaks:shave: fmt_compact::yak_shave: hello! I'm gonna shave a yak excitement="yay!" yaks=3 yak=2
+/// 2022-02-17T19:51:05.809554Z TRACE shaving_yaks:shave: fmt_compact::yak_shave: yak shaved successfully yaks=3 yak=2
+/// 2022-02-17T19:51:05.809581Z DEBUG shaving_yaks: yak_events: yak=2 shaved=true yaks=3
+/// 2022-02-17T19:51:05.809606Z TRACE shaving_yaks: fmt_compact::yak_shave: yaks_shaved=2 yaks=3
+/// 2022-02-17T19:51:05.809635Z TRACE shaving_yaks:shave: fmt_compact::yak_shave: hello! I'm gonna shave a yak excitement="yay!" yaks=3 yak=3
+/// 2022-02-17T19:51:05.809664Z  WARN shaving_yaks:shave: fmt_compact::yak_shave: could not locate yak yaks=3 yak=3
+/// 2022-02-17T19:51:05.809693Z DEBUG shaving_yaks: yak_events: yak=3 shaved=false yaks=3
+/// 2022-02-17T19:51:05.809717Z ERROR shaving_yaks: fmt_compact::yak_shave: failed to shave yak yak=3 error=missing yak error.sources=[out of space, out of cash] yaks=3
+/// 2022-02-17T19:51:05.809743Z TRACE shaving_yaks: fmt_compact::yak_shave: yaks_shaved=2 yaks=3
+/// 2022-02-17T19:51:05.809768Z  INFO fmt_compact: yak shaving completed all_yaks_shaved=false
+///
+/// 
#[derive(Default, Debug, Copy, Clone, Eq, PartialEq)] pub struct Compact; -/// Marker for `Format` that indicates that the default log format should be used. +/// Marker for [`Format`] that indicates that the default log format should be used. /// -/// This format shows the span context before printing event data. Spans are +/// This formatter shows the span context before printing event data. Spans are /// displayed including their names and fields. +/// +/// # Example Output +/// +///
:; cargo run --example fmt
+///     Finished dev [unoptimized + debuginfo] target(s) in 0.08s
+///      Running `target/debug/examples/fmt`
+/// 2022-02-15T18:40:14.289898Z  INFO fmt: preparing to shave yaks number_of_yaks=3
+/// 2022-02-15T18:40:14.289974Z  INFO shaving_yaks{yaks=3}: fmt::yak_shave: shaving yaks
+/// 2022-02-15T18:40:14.290011Z TRACE shaving_yaks{yaks=3}:shave{yak=1}: fmt::yak_shave: hello! I'm gonna shave a yak excitement="yay!"
+/// 2022-02-15T18:40:14.290038Z TRACE shaving_yaks{yaks=3}:shave{yak=1}: fmt::yak_shave: yak shaved successfully
+/// 2022-02-15T18:40:14.290070Z DEBUG shaving_yaks{yaks=3}: yak_events: yak=1 shaved=true
+/// 2022-02-15T18:40:14.290089Z TRACE shaving_yaks{yaks=3}: fmt::yak_shave: yaks_shaved=1
+/// 2022-02-15T18:40:14.290114Z TRACE shaving_yaks{yaks=3}:shave{yak=2}: fmt::yak_shave: hello! I'm gonna shave a yak excitement="yay!"
+/// 2022-02-15T18:40:14.290134Z TRACE shaving_yaks{yaks=3}:shave{yak=2}: fmt::yak_shave: yak shaved successfully
+/// 2022-02-15T18:40:14.290157Z DEBUG shaving_yaks{yaks=3}: yak_events: yak=2 shaved=true
+/// 2022-02-15T18:40:14.290174Z TRACE shaving_yaks{yaks=3}: fmt::yak_shave: yaks_shaved=2
+/// 2022-02-15T18:40:14.290198Z TRACE shaving_yaks{yaks=3}:shave{yak=3}: fmt::yak_shave: hello! I'm gonna shave a yak excitement="yay!"
+/// 2022-02-15T18:40:14.290222Z  WARN shaving_yaks{yaks=3}:shave{yak=3}: fmt::yak_shave: could not locate yak
+/// 2022-02-15T18:40:14.290247Z DEBUG shaving_yaks{yaks=3}: yak_events: yak=3 shaved=false
+/// 2022-02-15T18:40:14.290268Z ERROR shaving_yaks{yaks=3}: fmt::yak_shave: failed to shave yak yak=3 error=missing yak error.sources=[out of space, out of cash]
+/// 2022-02-15T18:40:14.290287Z TRACE shaving_yaks{yaks=3}: fmt::yak_shave: yaks_shaved=2
+/// 2022-02-15T18:40:14.290309Z  INFO fmt: yak shaving completed. all_yaks_shaved=false
+/// 
#[derive(Default, Debug, Copy, Clone, Eq, PartialEq)] pub struct Full; @@ -317,8 +393,11 @@ pub struct Full; /// You will usually want to use this as the `FormatEvent` for a `FmtSubscriber`. /// /// The default logging format, [`Full`] includes all fields in each event and its containing -/// spans. The [`Compact`] logging format includes only the fields from the most-recently-entered -/// span. +/// spans. The [`Compact`] logging format is intended to produce shorter log +/// lines; it displays each event's fields, along with fields from the current +/// span context, but other information is abbreviated. The [`Pretty`] logging +/// format is an extra-verbose, multi-line human-readable logging format +/// intended for use in development. #[derive(Debug, Clone)] pub struct Format { format: F, diff --git a/tracing-subscriber/src/fmt/format/pretty.rs b/tracing-subscriber/src/fmt/format/pretty.rs index d1c8ba95b6..a50d08ba75 100644 --- a/tracing-subscriber/src/fmt/format/pretty.rs +++ b/tracing-subscriber/src/fmt/format/pretty.rs @@ -17,6 +17,84 @@ use tracing_log::NormalizeEvent; use ansi_term::{Colour, Style}; /// An excessively pretty, human-readable event formatter. +/// +/// Unlike the [`Full`], [`Compact`], and [`Json`] formatters, this is a +/// multi-line output format. Each individual event may output multiple lines of +/// text. +/// +/// # Example Output +/// +///
:; cargo run --example fmt-pretty
+///     Finished dev [unoptimized + debuginfo] target(s) in 0.08s
+///      Running `target/debug/examples/fmt-pretty`
+///   2022-02-15T18:44:24.535324Z  INFO fmt_pretty: preparing to shave yaks, number_of_yaks: 3
+///     at examples/examples/fmt-pretty.rs:16 on main
+///
+///   2022-02-15T18:44:24.535403Z  INFO fmt_pretty::yak_shave: shaving yaks
+///     at examples/examples/fmt/yak_shave.rs:41 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535442Z TRACE fmt_pretty::yak_shave: hello! I'm gonna shave a yak, excitement: "yay!"
+///     at examples/examples/fmt/yak_shave.rs:16 on main
+///     in fmt_pretty::yak_shave::shave with yak: 1
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535469Z TRACE fmt_pretty::yak_shave: yak shaved successfully
+///     at examples/examples/fmt/yak_shave.rs:25 on main
+///     in fmt_pretty::yak_shave::shave with yak: 1
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535502Z DEBUG yak_events: yak: 1, shaved: true
+///     at examples/examples/fmt/yak_shave.rs:46 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535524Z TRACE fmt_pretty::yak_shave: yaks_shaved: 1
+///     at examples/examples/fmt/yak_shave.rs:55 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535551Z TRACE fmt_pretty::yak_shave: hello! I'm gonna shave a yak, excitement: "yay!"
+///     at examples/examples/fmt/yak_shave.rs:16 on main
+///     in fmt_pretty::yak_shave::shave with yak: 2
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535573Z TRACE fmt_pretty::yak_shave: yak shaved successfully
+///     at examples/examples/fmt/yak_shave.rs:25 on main
+///     in fmt_pretty::yak_shave::shave with yak: 2
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535600Z DEBUG yak_events: yak: 2, shaved: true
+///     at examples/examples/fmt/yak_shave.rs:46 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535618Z TRACE fmt_pretty::yak_shave: yaks_shaved: 2
+///     at examples/examples/fmt/yak_shave.rs:55 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535644Z TRACE fmt_pretty::yak_shave: hello! I'm gonna shave a yak, excitement: "yay!"
+///     at examples/examples/fmt/yak_shave.rs:16 on main
+///     in fmt_pretty::yak_shave::shave with yak: 3
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535670Z  WARN fmt_pretty::yak_shave: could not locate yak
+///     at examples/examples/fmt/yak_shave.rs:18 on main
+///     in fmt_pretty::yak_shave::shave with yak: 3
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535698Z DEBUG yak_events: yak: 3, shaved: false
+///     at examples/examples/fmt/yak_shave.rs:46 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535720Z ERROR fmt_pretty::yak_shave: failed to shave yak, yak: 3, error: missing yak, error.sources: [out of space, out of cash]
+///     at examples/examples/fmt/yak_shave.rs:51 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535742Z TRACE fmt_pretty::yak_shave: yaks_shaved: 2
+///     at examples/examples/fmt/yak_shave.rs:55 on main
+///     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
+///
+///   2022-02-15T18:44:24.535765Z  INFO fmt_pretty: yak shaving completed, all_yaks_shaved: false
+///     at examples/examples/fmt-pretty.rs:19 on main
+/// 
#[derive(Debug, Clone, Eq, PartialEq)] pub struct Pretty { display_location: bool, diff --git a/tracing-subscriber/src/fmt/mod.rs b/tracing-subscriber/src/fmt/mod.rs index f3c78cf53d..e9a082e59a 100644 --- a/tracing-subscriber/src/fmt/mod.rs +++ b/tracing-subscriber/src/fmt/mod.rs @@ -70,132 +70,25 @@ //! //! * [`format::Full`]: The default formatter. This emits human-readable, //! single-line logs for each event that occurs, with the current span context -//! displayed before the formatted representation of the event. +//! displayed before the formatted representation of the event. See +//! [here](format::Full#example-output) for sample output. //! -//! For example: -//!
    Finished dev [unoptimized + debuginfo] target(s) in 1.59s
-//!        Running `target/debug/examples/fmt`
-//!   Oct 24 12:55:47.814  INFO fmt: preparing to shave yaks number_of_yaks=3
-//!   Oct 24 12:55:47.814  INFO shaving_yaks{yaks=3}: fmt::yak_shave: shaving yaks
-//!   Oct 24 12:55:47.814 TRACE shaving_yaks{yaks=3}:shave{yak=1}: fmt::yak_shave: hello! I'm gonna shave a yak excitement="yay!"
-//!   Oct 24 12:55:47.814 TRACE shaving_yaks{yaks=3}:shave{yak=1}: fmt::yak_shave: yak shaved successfully
-//!   Oct 24 12:55:47.814 DEBUG shaving_yaks{yaks=3}: yak_events: yak=1 shaved=true
-//!   Oct 24 12:55:47.814 TRACE shaving_yaks{yaks=3}: fmt::yak_shave: yaks_shaved=1
-//!   Oct 24 12:55:47.815 TRACE shaving_yaks{yaks=3}:shave{yak=2}: fmt::yak_shave: hello! I'm gonna shave a yak excitement="yay!"
-//!   Oct 24 12:55:47.815 TRACE shaving_yaks{yaks=3}:shave{yak=2}: fmt::yak_shave: yak shaved successfully
-//!   Oct 24 12:55:47.815 DEBUG shaving_yaks{yaks=3}: yak_events: yak=2 shaved=true
-//!   Oct 24 12:55:47.815 TRACE shaving_yaks{yaks=3}: fmt::yak_shave: yaks_shaved=2
-//!   Oct 24 12:55:47.815 TRACE shaving_yaks{yaks=3}:shave{yak=3}: fmt::yak_shave: hello! I'm gonna shave a yak excitement="yay!"
-//!   Oct 24 12:55:47.815  WARN shaving_yaks{yaks=3}:shave{yak=3}: fmt::yak_shave: could not locate yak
-//!   Oct 24 12:55:47.815 DEBUG shaving_yaks{yaks=3}: yak_events: yak=3 shaved=false
-//!   Oct 24 12:55:47.815 ERROR shaving_yaks{yaks=3}: fmt::yak_shave: failed to shave yak yak=3 error=missing yak
-//!   Oct 24 12:55:47.815 TRACE shaving_yaks{yaks=3}: fmt::yak_shave: yaks_shaved=2
-//!   Oct 24 12:55:47.815  INFO fmt: yak shaving completed all_yaks_shaved=false
-//!   
+//! * [`format::Compact`]: A variant of the default formatter, optimized for +//! short line lengths. Fields from the current span context are appended to +//! the fields of the formatted event. See +//! [here](format::Compact#example-output) for sample output. //! //! * [`format::Pretty`]: Emits excessively pretty, multi-line logs, optimized //! for human readability. This is primarily intended to be used in local //! development and debugging, or for command-line applications, where //! automated analysis and compact storage of logs is less of a priority than -//! readability and visual appeal. -//! -//! For example: -//!
    Finished dev [unoptimized + debuginfo] target(s) in 1.61s
-//!        Running `target/debug/examples/fmt-pretty`
-//!   Oct 24 12:57:29.386 fmt_pretty: preparing to shave yaks, number_of_yaks: 3
-//!     at examples/examples/fmt-pretty.rs:16 on main
-//!
-//!   Oct 24 12:57:29.386 fmt_pretty::yak_shave: shaving yaks
-//!     at examples/examples/fmt/yak_shave.rs:38 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: hello! I'm gonna shave a yak, excitement: "yay!"
-//!     at examples/examples/fmt/yak_shave.rs:14 on main
-//!     in fmt_pretty::yak_shave::shave with yak: 1
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: yak shaved successfully
-//!     at examples/examples/fmt/yak_shave.rs:22 on main
-//!     in fmt_pretty::yak_shave::shave with yak: 1
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 yak_events: yak: 1, shaved: true
-//!     at examples/examples/fmt/yak_shave.rs:43 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: yaks_shaved: 1
-//!     at examples/examples/fmt/yak_shave.rs:52 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: hello! I'm gonna shave a yak, excitement: "yay!"
-//!     at examples/examples/fmt/yak_shave.rs:14 on main
-//!     in fmt_pretty::yak_shave::shave with yak: 2
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: yak shaved successfully
-//!     at examples/examples/fmt/yak_shave.rs:22 on main
-//!     in fmt_pretty::yak_shave::shave with yak: 2
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 yak_events: yak: 2, shaved: true
-//!     at examples/examples/fmt/yak_shave.rs:43 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: yaks_shaved: 2
-//!     at examples/examples/fmt/yak_shave.rs:52 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: hello! I'm gonna shave a yak, excitement: "yay!"
-//!     at examples/examples/fmt/yak_shave.rs:14 on main
-//!     in fmt_pretty::yak_shave::shave with yak: 3
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: could not locate yak
-//!     at examples/examples/fmt/yak_shave.rs:16 on main
-//!     in fmt_pretty::yak_shave::shave with yak: 3
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 yak_events: yak: 3, shaved: false
-//!     at examples/examples/fmt/yak_shave.rs:43 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: failed to shave yak, yak: 3, error: missing yak
-//!     at examples/examples/fmt/yak_shave.rs:48 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty::yak_shave: yaks_shaved: 2
-//!     at examples/examples/fmt/yak_shave.rs:52 on main
-//!     in fmt_pretty::yak_shave::shaving_yaks with yaks: 3
-//!
-//!   Oct 24 12:57:29.387 fmt_pretty: yak shaving completed, all_yaks_shaved: false
-//!     at examples/examples/fmt-pretty.rs:19 on main
-//!   
+//! readability and visual appeal. See [here](format::Pretty#example-output) +//! for sample output. //! //! * [`format::Json`]: Outputs newline-delimited JSON logs. This is intended //! for production use with systems where structured logs are consumed as JSON -//! by analysis and viewing tools. The JSON output, as seen below, is *not* -//! optimized for human readability. -//! -//! For example: -//!
    Finished dev [unoptimized + debuginfo] target(s) in 1.58s
-//!        Running `target/debug/examples/fmt-json`
-//!   {"timestamp":"Oct 24 13:00:00.873","level":"INFO","fields":{"message":"preparing to shave yaks","number_of_yaks":3},"target":"fmt_json"}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"INFO","fields":{"message":"shaving yaks"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"message":"hello! I'm gonna shave a yak","excitement":"yay!"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":"1","name":"shave"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"message":"yak shaved successfully"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":"1","name":"shave"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"DEBUG","fields":{"yak":1,"shaved":true},"target":"yak_events","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"yaks_shaved":1},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"message":"hello! I'm gonna shave a yak","excitement":"yay!"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":"2","name":"shave"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"message":"yak shaved successfully"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":"2","name":"shave"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"DEBUG","fields":{"yak":2,"shaved":true},"target":"yak_events","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"yaks_shaved":2},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.874","level":"TRACE","fields":{"message":"hello! I'm gonna shave a yak","excitement":"yay!"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":"3","name":"shave"}]}
-//!   {"timestamp":"Oct 24 13:00:00.875","level":"WARN","fields":{"message":"could not locate yak"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"},{"yak":"3","name":"shave"}]}
-//!   {"timestamp":"Oct 24 13:00:00.875","level":"DEBUG","fields":{"yak":3,"shaved":false},"target":"yak_events","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.875","level":"ERROR","fields":{"message":"failed to shave yak","yak":3,"error":"missing yak"},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.875","level":"TRACE","fields":{"yaks_shaved":2},"target":"fmt_json::yak_shave","spans":[{"yaks":3,"name":"shaving_yaks"}]}
-//!   {"timestamp":"Oct 24 13:00:00.875","level":"INFO","fields":{"message":"yak shaving completed","all_yaks_shaved":false},"target":"fmt_json"}
-//!   
+//! by analysis and viewing tools. The JSON output is not optimized for human +//! readability. See [here](format::Json#example-output) for sample output. //! //! ### Customizing Formatters //!