11use std:: { fmt, io:: Write } ;
22
3+ #[ cfg( feature = "otel" ) ]
4+ use opentelemetry_sdk:: trace:: Tracer ;
35use termcolor:: { Color , ColorSpec , WriteColor } ;
46use tracing:: { level_filters:: LevelFilter , Event , Subscriber } ;
57use tracing_subscriber:: {
68 fmt:: {
79 format:: { self , FormatEvent , FormatFields } ,
810 FmtContext ,
911 } ,
12+ layer:: SubscriberExt ,
1013 registry:: LookupSpan ,
11- EnvFilter , Layer ,
14+ reload , EnvFilter , Layer , Registry ,
1215} ;
1316
14- #[ cfg( feature = "otel" ) ]
15- use opentelemetry_sdk:: trace:: Tracer ;
16-
1717use crate :: { currentprocess:: Process , utils:: notify:: NotificationLevel } ;
1818
19- pub fn tracing_subscriber ( process : & Process ) -> impl tracing:: Subscriber {
20- use tracing_subscriber:: { layer:: SubscriberExt , Registry } ;
21-
19+ pub fn tracing_subscriber (
20+ process : & Process ,
21+ ) -> (
22+ impl tracing:: Subscriber ,
23+ reload:: Handle < EnvFilter , Registry > ,
24+ ) {
2225 #[ cfg( feature = "otel" ) ]
2326 let telemetry = telemetry ( process) ;
24- let console_logger = console_logger ( process) ;
27+ let ( console_logger, console_filter ) = console_logger ( process) ;
2528 #[ cfg( feature = "otel" ) ]
2629 {
27- Registry :: default ( ) . with ( console_logger) . with ( telemetry)
30+ (
31+ Registry :: default ( ) . with ( console_logger) . with ( telemetry) ,
32+ console_filter,
33+ )
2834 }
2935 #[ cfg( not( feature = "otel" ) ) ]
3036 {
31- Registry :: default ( ) . with ( console_logger)
37+ ( Registry :: default ( ) . with ( console_logger) , console_filter )
3238 }
3339}
3440
@@ -38,7 +44,7 @@ pub fn tracing_subscriber(process: &Process) -> impl tracing::Subscriber {
3844/// When the `RUSTUP_LOG` environment variable is present, a standard [`tracing_subscriber`]
3945/// formatter will be used according to the filtering directives set in its value.
4046/// Otherwise, this logger will use [`EventFormatter`] to mimic "classic" Rustup `stderr` output.
41- fn console_logger < S > ( process : & Process ) -> impl Layer < S >
47+ fn console_logger < S > ( process : & Process ) -> ( impl Layer < S > , reload :: Handle < EnvFilter , S > )
4248where
4349 S : Subscriber + for < ' span > LookupSpan < ' span > ,
4450{
@@ -55,17 +61,22 @@ where
5561 . with_writer ( move || process. stderr ( ) )
5662 . with_ansi ( has_ansi) ;
5763 if let Ok ( directives) = maybe_rustup_log_directives {
58- let env_filter = EnvFilter :: builder ( )
59- . with_default_directive ( LevelFilter :: INFO . into ( ) )
60- . parse_lossy ( directives) ;
61- logger. compact ( ) . with_filter ( env_filter) . boxed ( )
64+ let ( env_filter, handle) = reload:: Layer :: new (
65+ EnvFilter :: builder ( )
66+ . with_default_directive ( LevelFilter :: INFO . into ( ) )
67+ . parse_lossy ( directives) ,
68+ ) ;
69+ ( logger. compact ( ) . with_filter ( env_filter) . boxed ( ) , handle)
6270 } else {
6371 // Receive log lines from Rustup only.
64- let env_filter = EnvFilter :: new ( "rustup=DEBUG" ) ;
65- logger
66- . event_format ( EventFormatter )
67- . with_filter ( env_filter)
68- . boxed ( )
72+ let ( env_filter, handle) = reload:: Layer :: new ( EnvFilter :: new ( "rustup=DEBUG" ) ) ;
73+ (
74+ logger
75+ . event_format ( EventFormatter )
76+ . with_filter ( env_filter)
77+ . boxed ( ) ,
78+ handle,
79+ )
6980 }
7081}
7182
0 commit comments