1
1
use opentelemetry:: trace:: { TraceError , TracerProvider } ;
2
2
use opentelemetry_sdk:: trace:: { SdkTracerProvider , Tracer } ;
3
- use tracing:: { info, Subscriber } ;
3
+ use tracing:: { info, level_filters :: LevelFilter , Subscriber } ;
4
4
use tracing_opentelemetry:: OpenTelemetryLayer ;
5
5
use tracing_subscriber:: { filter:: EnvFilter , layer:: SubscriberExt , registry:: LookupSpan , Layer } ;
6
6
@@ -43,21 +43,41 @@ where
43
43
}
44
44
45
45
#[ must_use]
46
- pub fn build_loglevel_filter_layer ( ) -> tracing_subscriber:: filter:: EnvFilter {
47
- // filter what is output on log (fmt)
48
- // std::env::set_var("RUST_LOG", "warn,otel::tracing=info,otel=debug");
49
- std:: env:: set_var (
50
- "RUST_LOG" ,
51
- format ! (
52
- // `otel::tracing` should be a level info to emit opentelemetry trace & span
53
- // `otel::setup` set to debug to log detected resources, configuration read
54
- "{},otel::tracing=trace" ,
55
- std:: env:: var( "RUST_LOG" )
56
- . or_else( |_| std:: env:: var( "OTEL_LOG_LEVEL" ) )
57
- . unwrap_or_else( |_| "info" . to_string( ) )
58
- ) ,
59
- ) ;
60
- EnvFilter :: from_default_env ( )
46
+ #[ deprecated = "replaced by the configurable build_level_filter_layer(\" \" )" ]
47
+ pub fn build_loglevel_filter_layer ( ) -> EnvFilter {
48
+ build_level_filter_layer ( "" ) . unwrap_or_default ( )
49
+ }
50
+
51
+ /// Read the configuration from (first non empty used, priority top to bottom):
52
+ ///
53
+ /// - from parameter `directives`
54
+ /// - from environment variable `RUST_LOG`
55
+ /// - from environment variable `OTEL_LOG_LEVEL`
56
+ /// - default to `Level::INFO`
57
+ ///
58
+ /// And add directive to:
59
+ ///
60
+ /// - `otel::tracing` should be a level info to emit opentelemetry trace & span
61
+ ///
62
+ /// You can customize parameter "directives", by adding:
63
+ ///
64
+ /// - `otel::setup=debug` set to debug to log detected resources, configuration read (optional)
65
+ ///
66
+ /// see [Directives syntax](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives)
67
+ pub fn build_level_filter_layer ( log_directives : & str ) -> Result < EnvFilter , Error > {
68
+ let dirs = if log_directives. is_empty ( ) {
69
+ std:: env:: var ( "RUST_LOG" )
70
+ . or_else ( |_| std:: env:: var ( "OTEL_LOG_LEVEL" ) )
71
+ . unwrap_or_else ( |_| "info" . to_string ( ) )
72
+ } else {
73
+ log_directives. to_string ( )
74
+ } ;
75
+ let directive_to_allow_otel_trace = "otel::tracing=trace" . parse ( ) ?;
76
+
77
+ Ok ( EnvFilter :: builder ( )
78
+ . with_default_directive ( LevelFilter :: INFO . into ( ) )
79
+ . parse_lossy ( dirs)
80
+ . add_directive ( directive_to_allow_otel_trace) )
61
81
}
62
82
63
83
pub fn build_otel_layer < S > ( ) -> Result < ( OpenTelemetryLayer < S , Tracer > , TracingGuard ) , TraceError >
@@ -105,9 +125,14 @@ impl Drop for TracingGuard {
105
125
}
106
126
107
127
pub fn init_subscribers ( ) -> Result < TracingGuard , Error > {
128
+ init_subscribers_and_loglevel ( "" )
129
+ }
130
+
131
+ /// see [`build_level_filter_layer`] for the syntax of `log_directives`
132
+ pub fn init_subscribers_and_loglevel ( log_directives : & str ) -> Result < TracingGuard , Error > {
108
133
//setup a temporary subscriber to log output during setup
109
134
let subscriber = tracing_subscriber:: registry ( )
110
- . with ( build_loglevel_filter_layer ( ) )
135
+ . with ( build_level_filter_layer ( log_directives ) ? )
111
136
. with ( build_logger_text ( ) ) ;
112
137
let _guard = tracing:: subscriber:: set_default ( subscriber) ;
113
138
info ! ( "init logging & tracing" ) ;
@@ -116,7 +141,7 @@ pub fn init_subscribers() -> Result<TracingGuard, Error> {
116
141
117
142
let subscriber = tracing_subscriber:: registry ( )
118
143
. with ( layer)
119
- . with ( build_loglevel_filter_layer ( ) )
144
+ . with ( build_level_filter_layer ( log_directives ) ? )
120
145
. with ( build_logger_text ( ) ) ;
121
146
tracing:: subscriber:: set_global_default ( subscriber) ?;
122
147
Ok ( guard)
0 commit comments