tracing_setup/
dynamic_level.rs

1crate::ix!();
2
3pub fn setup_dynamic_tracing(initial_level: Level) 
4    -> reload::Handle<EnvFilter, impl tracing::Subscriber + Send + Sync> 
5{
6    // Create an EnvFilter with the initial level
7    let filter = EnvFilter::from_default_env()
8        .add_directive(initial_level.into());
9
10    // Create a reloadable layer
11    let (filter_layer, reload_handle) = reload::Layer::new(filter);
12
13    // Build the subscriber
14    let subscriber = tracing_subscriber::fmt()
15        .with_max_level(initial_level)
16        .finish()
17        .with(filter_layer);
18
19    tracing::subscriber::set_global_default(subscriber).expect("Failed to set subscriber");
20
21    reload_handle
22}
23
24#[cfg(test)]
25mod dynamic_tracing_tests {
26    use super::*;
27    use tracing::Level;
28    use tracing_subscriber::EnvFilter;
29
30    #[test]
31    fn test_dynamic_tracing() {
32        // Set up dynamic tracing with initial level INFO
33        let reload_handle = setup_dynamic_tracing(Level::INFO);
34
35        // Log messages at different levels
36        tracing::info!("This is an info message");
37        tracing::debug!("This debug message should NOT appear at INFO level");
38
39        // Dynamically set the logging level to DEBUG
40        reload_handle.reload(EnvFilter::new("debug")).unwrap();
41
42        tracing::debug!("This debug message should appear at DEBUG level");
43    }
44}