@@ -4,6 +4,7 @@ use super::TUI_LOGGER;
44use log:: { self , Log , Record } ;
55use std:: collections:: BTreeMap ;
66use std:: fmt;
7+ use tracing_subscriber:: registry:: LookupSpan ;
78use tracing_subscriber:: Layer ;
89
910#[ derive( Default ) ]
@@ -85,20 +86,46 @@ impl<'a> tracing::field::Visit for ToStringVisitor<'a> {
8586/// tracing::info!("Logging via tracing works!");
8687/// }
8788/// ```
89+
90+ struct SpanAttributes {
91+ attributes : String ,
92+ }
93+
8894pub struct TuiTracingSubscriberLayer ;
8995
9096impl < S > Layer < S > for TuiTracingSubscriberLayer
9197where
92- S : tracing:: Subscriber ,
98+ S : tracing:: Subscriber + for < ' a > LookupSpan < ' a > ,
9399{
94- fn on_event (
100+ fn on_new_span (
95101 & self ,
96- event : & tracing:: Event < ' _ > ,
97- _ctx : tracing_subscriber:: layer:: Context < ' _ , S > ,
102+ attrs : & tracing:: span:: Attributes < ' _ > ,
103+ id : & tracing:: span:: Id ,
104+ ctx : tracing_subscriber:: layer:: Context < ' _ , S > ,
98105 ) {
106+ let mut visitor = ToStringVisitor :: default ( ) ;
107+ attrs. record ( & mut visitor) ;
108+ ctx. span ( id)
109+ . unwrap ( )
110+ . extensions_mut ( )
111+ . insert ( SpanAttributes {
112+ attributes : format ! ( "{}" , visitor) ,
113+ } ) ;
114+ }
115+
116+ fn on_event ( & self , event : & tracing:: Event < ' _ > , ctx : tracing_subscriber:: layer:: Context < ' _ , S > ) {
99117 let mut visitor = ToStringVisitor :: default ( ) ;
100118 event. record ( & mut visitor) ;
101119
120+ let span_attributes = ctx
121+ . event_span ( event)
122+ . and_then ( |s| {
123+ s. extensions ( )
124+ . get :: < SpanAttributes > ( )
125+ . map ( |a| a. attributes . to_owned ( ) )
126+ } )
127+ . unwrap_or_else ( String :: new) ;
128+
102129 let level = match * event. metadata ( ) . level ( ) {
103130 tracing:: Level :: ERROR => log:: Level :: Error ,
104131 tracing:: Level :: WARN => log:: Level :: Warn ,
@@ -109,7 +136,7 @@ where
109136
110137 TUI_LOGGER . log (
111138 & Record :: builder ( )
112- . args ( format_args ! ( "{}" , visitor) )
139+ . args ( format_args ! ( "{}{}" , span_attributes , visitor) )
113140 . level ( level)
114141 . target ( event. metadata ( ) . target ( ) )
115142 . file ( event. metadata ( ) . file ( ) )
0 commit comments