11use opentelemetry:: trace:: { TraceError , TracerProvider } ;
22use opentelemetry_sdk:: trace:: { SdkTracerProvider , Tracer } ;
3- use tracing:: { info, Subscriber } ;
3+ use tracing:: { info, level_filters :: LevelFilter , Subscriber } ;
44use tracing_opentelemetry:: OpenTelemetryLayer ;
55use tracing_subscriber:: { filter:: EnvFilter , layer:: SubscriberExt , registry:: LookupSpan , Layer } ;
66
@@ -43,21 +43,41 @@ where
4343}
4444
4545#[ 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) )
6181}
6282
6383pub fn build_otel_layer < S > ( ) -> Result < ( OpenTelemetryLayer < S , Tracer > , TracingGuard ) , TraceError >
@@ -105,9 +125,14 @@ impl Drop for TracingGuard {
105125}
106126
107127pub 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 > {
108133 //setup a temporary subscriber to log output during setup
109134 let subscriber = tracing_subscriber:: registry ( )
110- . with ( build_loglevel_filter_layer ( ) )
135+ . with ( build_level_filter_layer ( log_directives ) ? )
111136 . with ( build_logger_text ( ) ) ;
112137 let _guard = tracing:: subscriber:: set_default ( subscriber) ;
113138 info ! ( "init logging & tracing" ) ;
@@ -116,7 +141,7 @@ pub fn init_subscribers() -> Result<TracingGuard, Error> {
116141
117142 let subscriber = tracing_subscriber:: registry ( )
118143 . with ( layer)
119- . with ( build_loglevel_filter_layer ( ) )
144+ . with ( build_level_filter_layer ( log_directives ) ? )
120145 . with ( build_logger_text ( ) ) ;
121146 tracing:: subscriber:: set_global_default ( subscriber) ?;
122147 Ok ( guard)
0 commit comments