1
1
use std:: { fmt, io:: Write } ;
2
2
3
+ #[ cfg( feature = "otel" ) ]
4
+ use opentelemetry_sdk:: trace:: Tracer ;
3
5
use termcolor:: { Color , ColorSpec , WriteColor } ;
4
6
use tracing:: { level_filters:: LevelFilter , Event , Subscriber } ;
5
7
use tracing_subscriber:: {
6
8
fmt:: {
7
9
format:: { self , FormatEvent , FormatFields } ,
8
10
FmtContext ,
9
11
} ,
12
+ layer:: SubscriberExt ,
10
13
registry:: LookupSpan ,
11
- EnvFilter , Layer ,
14
+ reload , EnvFilter , Layer , Registry ,
12
15
} ;
13
16
14
- #[ cfg( feature = "otel" ) ]
15
- use opentelemetry_sdk:: trace:: Tracer ;
16
-
17
17
use crate :: { currentprocess:: Process , utils:: notify:: NotificationLevel } ;
18
18
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
+ ) {
22
25
#[ cfg( feature = "otel" ) ]
23
26
let telemetry = telemetry ( process) ;
24
- let console_logger = console_logger ( process) ;
27
+ let ( console_logger, console_filter ) = console_logger ( process) ;
25
28
#[ cfg( feature = "otel" ) ]
26
29
{
27
- Registry :: default ( ) . with ( console_logger) . with ( telemetry)
30
+ (
31
+ Registry :: default ( ) . with ( console_logger) . with ( telemetry) ,
32
+ console_filter,
33
+ )
28
34
}
29
35
#[ cfg( not( feature = "otel" ) ) ]
30
36
{
31
- Registry :: default ( ) . with ( console_logger)
37
+ ( Registry :: default ( ) . with ( console_logger) , console_filter )
32
38
}
33
39
}
34
40
@@ -38,7 +44,7 @@ pub fn tracing_subscriber(process: &Process) -> impl tracing::Subscriber {
38
44
/// When the `RUSTUP_LOG` environment variable is present, a standard [`tracing_subscriber`]
39
45
/// formatter will be used according to the filtering directives set in its value.
40
46
/// 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 > )
42
48
where
43
49
S : Subscriber + for < ' span > LookupSpan < ' span > ,
44
50
{
@@ -55,17 +61,22 @@ where
55
61
. with_writer ( move || process. stderr ( ) )
56
62
. with_ansi ( has_ansi) ;
57
63
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)
62
70
} else {
63
71
// 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
+ )
69
80
}
70
81
}
71
82
0 commit comments