Skip to main content

deribit_websocket/utils/
logger.rs

1//! Logger setup utility for the deribit-websocket crate
2//!
3//! Provides a simple logger configuration based on environment variables.
4
5use std::env;
6use std::sync::Once;
7use tracing::Level;
8use tracing_subscriber::FmtSubscriber;
9
10static INIT: Once = Once::new();
11
12/// Sets up the logger for the application.
13///
14/// The logger level is determined by the `DERIBIT_LOG_LEVEL` environment variable.
15/// If the variable is not set, it defaults to `INFO`.
16///
17/// This function is safe to call multiple times - it will only initialize
18/// the logger once.
19///
20/// # Example
21///
22/// ```rust,no_run
23/// use deribit_websocket::utils::setup_logger;
24///
25/// // Set log level via environment variable (unsafe in Rust 2024 edition)
26/// unsafe {
27///     std::env::set_var("DERIBIT_LOG_LEVEL", "DEBUG");
28/// }
29///
30/// // Initialize the logger
31/// setup_logger();
32///
33/// // Now you can use tracing macros
34/// tracing::info!("Logger initialized");
35/// ```
36pub fn setup_logger() {
37    INIT.call_once(|| {
38        let log_level = env::var("DERIBIT_LOG_LEVEL")
39            .unwrap_or_else(|_| "INFO".to_string())
40            .to_uppercase();
41
42        let level = match log_level.as_str() {
43            "DEBUG" => Level::DEBUG,
44            "ERROR" => Level::ERROR,
45            "WARN" => Level::WARN,
46            "TRACE" => Level::TRACE,
47            _ => Level::INFO,
48        };
49
50        let subscriber = FmtSubscriber::builder().with_max_level(level).finish();
51
52        if tracing::subscriber::set_global_default(subscriber).is_ok() {
53            tracing::debug!("Log level set to: {}", level);
54        }
55    });
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61
62    #[test]
63    fn test_setup_logger_can_be_called_multiple_times() {
64        // First call
65        setup_logger();
66        // Second call should not panic
67        setup_logger();
68    }
69}