tracing_setup/
setup_and_buffered_subscriber.rs

1crate::ix!();
2
3pub trait BufferedSubscriber: Subscriber + Flushable {}
4
5#[derive(Debug)]
6pub struct BufferedSubscriberLayer<S> {
7    inner:          tracing_subscriber::layer::Layered<BufferedLayer, S>,
8    buffered_layer: Arc<BufferedLayer>,
9}
10
11impl<S: Subscriber> Flushable for BufferedSubscriberLayer<S> {
12
13    fn flush(&self) {
14        self.buffered_layer.flush();
15    }
16}
17
18impl<S: Subscriber> Subscriber for BufferedSubscriberLayer<S> {
19    fn enabled(&self, metadata: &tracing::Metadata<'_>) -> bool {
20        self.inner.enabled(metadata)
21    }
22
23    fn new_span(&self, span: &tracing::span::Attributes<'_>) -> tracing::Id {
24        self.inner.new_span(span)
25    }
26
27    fn record(&self, span: &tracing::Id, values: &tracing::span::Record<'_>) {
28        self.inner.record(span, values);
29    }
30
31    fn record_follows_from(&self, span: &tracing::Id, follows: &tracing::Id) {
32        self.inner.record_follows_from(span, follows);
33    }
34
35    fn event(&self, event: &tracing::Event<'_>) {
36        self.inner.event(event);
37    }
38
39    fn enter(&self, span: &tracing::Id) {
40        self.inner.enter(span);
41    }
42
43    fn exit(&self, span: &tracing::Id) {
44        self.inner.exit(span);
45    }
46}
47
48pub fn setup_default_buffered_tracing() -> Arc<BufferedSubscriberLayer<Registry>> 
49{
50    setup_buffered_tracing(None, EventPrinter::default())
51}
52
53pub fn setup_buffered_tracing(
54    tag: Option<&str>,
55    printer: EventPrinter,
56) -> Arc<BufferedSubscriberLayer<Registry>>
57{
58    let mut layer = match tag {
59        Some(t) => BufferedLayer::new_with_tag(t),
60        None    => BufferedLayer::default(),
61    };
62
63    // Let the layer know how to print
64    layer.set_event_printer(printer);
65
66    let subscriber = Registry::default().with(layer.clone());
67
68    Arc::new(BufferedSubscriberLayer {
69        inner: subscriber,
70        buffered_layer: layer.into(),
71    })
72}