use tracing::{info, warn}; use tracing_subscriber::EnvFilter; pub fn init_tracing() { let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); tracing_subscriber::fmt().with_env_filter(filter).init(); } pub async fn shutdown_signal() { let ctrl_c = async { if let Err(err) = tokio::signal::ctrl_c().await { warn!(error = %err, "failed to install ctrl_c handler"); } }; #[cfg(unix)] let terminate = async { use tokio::signal::unix::{SignalKind, signal}; match signal(SignalKind::terminate()) { Ok(mut s) => { s.recv().await; } Err(err) => { warn!(error = %err, "failed to install SIGTERM handler"); } } }; #[cfg(not(unix))] let terminate = std::future::pending::<()>(); tokio::select! { _ = ctrl_c => info!("received SIGINT"), _ = terminate => info!("received SIGTERM"), } }