tracing-loki 0.2.7

A tracing layer for shipping logs to Grafana Loki
Documentation
use serde::ser::SerializeMap;
use serde::Serialize;
use serde::Serializer;
use std::error;
use std::fmt;
use tracing_core::field::Visit;
use tracing_core::Event;
use tracing_core::Field;
use tracing_serde::SerdeMapVisitor;

pub struct SerializeEventFieldMapStrippingLog<'a>(pub &'a Event<'a>);

impl<'a> Serialize for SerializeEventFieldMapStrippingLog<'a> {
    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
        let len = self.0.fields().count();
        let serializer = serializer.serialize_map(Some(len))?;
        let mut visitor = SerdeMapVisitorStrippingLog::new(serializer);
        self.0.record(&mut visitor);
        visitor.finish()
    }
}

struct SerdeMapVisitorStrippingLog<S: SerializeMap>(SerdeMapVisitor<S>);

impl<S: SerializeMap> SerdeMapVisitorStrippingLog<S> {
    fn new(serializer: S) -> SerdeMapVisitorStrippingLog<S> {
        SerdeMapVisitorStrippingLog(SerdeMapVisitor::new(serializer))
    }
    fn ignore(field: &Field) -> bool {
        field.name().starts_with("log.")
    }
    fn finish(self) -> Result<S::Ok, S::Error> {
        self.0.finish()
    }
}

impl<S: SerializeMap> Visit for SerdeMapVisitorStrippingLog<S> {
    fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {
        if !Self::ignore(field) {
            self.0.record_debug(field, value);
        }
    }
    fn record_f64(&mut self, field: &Field, value: f64) {
        if !Self::ignore(field) {
            self.0.record_f64(field, value);
        }
    }
    fn record_i64(&mut self, field: &Field, value: i64) {
        if !Self::ignore(field) {
            self.0.record_i64(field, value);
        }
    }
    fn record_u64(&mut self, field: &Field, value: u64) {
        if !Self::ignore(field) {
            self.0.record_u64(field, value);
        }
    }
    fn record_bool(&mut self, field: &Field, value: bool) {
        if !Self::ignore(field) {
            self.0.record_bool(field, value);
        }
    }
    fn record_str(&mut self, field: &Field, value: &str) {
        if !Self::ignore(field) {
            self.0.record_str(field, value);
        }
    }
    fn record_error(&mut self, field: &Field, value: &(dyn error::Error + 'static)) {
        if !Self::ignore(field) {
            self.0.record_error(field, value);
        }
    }
}