#tracing #json-format #tracing-subscriber #events #fields #timestamp #formatter

tracing-ndjson

A customizable ndjson formatter for outputting tracing events

4 releases

0.2.0 Oct 20, 2023
0.1.2 Oct 9, 2023
0.1.1 Oct 8, 2023
0.1.0 Oct 8, 2023

#38 in #tracing-subscriber

Download history 2/week @ 2024-02-15 12/week @ 2024-02-22 14/week @ 2024-02-29 22/week @ 2024-03-07 12/week @ 2024-03-14 1/week @ 2024-03-21 30/week @ 2024-03-28 22/week @ 2024-04-04 39/week @ 2024-04-11

93 downloads per month

MIT license

26KB
432 lines

tracing-ndjson

Crates.io Rust docs.rs

A simple library for tracing in new-line delimited JSON format. This library is meant to be used with tracing as an alternative to the tracing_subscriber::fmt::json formatter.

The goal of this crate is to provide a flattend JSON event, comprising of fields from the span attributes and event fields, with customizeable field names and timestamp formats.

Features

  • Configurable field names for target, message, level, and timestamp.
  • Configurable timestamp formats
    • RFC3339 (2023-10-08T03:30:52Z),
    • RFC339Nanos (2023-10-08T03:30:52.123456789Z)
    • Unix timestamp (1672535452)
    • UnixMills (1672535452123)
  • Captures all span attributes and event fields in the root of the JSON object. Collisions will result in overwriting the existing field.

Limitations

  • When flattening span attributes and event fields, the library will overwrite any existing fields with the same name, including the built-in fields such as target, message, level, timestamp, file, and line.
  • Non-determistic ordering of fields in the JSON object. (JSON objects are unordered)
  • Currently only logs to stdout. (PRs welcome!)

Usage

Add this to your Cargo.toml:

[dependencies]
tracing = "0.1"
tracing-ndjson = "0.2"
use tracing_subscriber::prelude::*;

fn main() {
    let subscriber = tracing_subscriber::registry().with(tracing_ndjson::layer());

    tracing::subscriber::set_global_default(subscriber).unwrap();

    tracing::info!(life = 42, "Hello, world!");
    // {"level":"info","target":"default","life":42,"timestamp":"2023-10-20T21:17:49Z","message":"Hello, world!"}

    let span = tracing::info_span!("hello", "request.uri" = "https://example.com");
    span.in_scope(|| {
        tracing::info!("Hello, world!");
        // {"message":"Hello, world!","request.uri":"https://example.com","level":"info","target":"default","timestamp":"2023-10-20T21:17:49Z"}
    });
}

Examples

See the examples directory for more examples.

License

Licensed under MIT license

Dependencies

~2.7–4MB
~70K SLoC