| use tracing::{info, warn, error}; | |
| use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; | |
| // Custom local timezone time formatter | |
| struct LocalTimer; | |
| impl tracing_subscriber::fmt::time::FormatTime for LocalTimer { | |
| fn format_time(&self, w: &mut tracing_subscriber::fmt::format::Writer<'_>) -> std::fmt::Result { | |
| let now = chrono::Local::now(); | |
| write!(w, "{}", now.to_rfc3339()) | |
| } | |
| } | |
| /// Initialize logging system (stdout only for cloud deployment) | |
| pub fn init_logger() { | |
| // Capture log macro logs | |
| let _ = tracing_log::LogTracer::init(); | |
| // Console output layer with local timezone | |
| let console_layer = fmt::Layer::new() | |
| .with_target(false) | |
| .with_thread_ids(false) | |
| .with_level(true) | |
| .with_timer(LocalTimer); | |
| // Filter layer (default INFO and above) | |
| let filter_layer = EnvFilter::try_from_default_env() | |
| .unwrap_or_else(|_| EnvFilter::new("info")); | |
| // Initialize global subscriber | |
| let _ = tracing_subscriber::registry() | |
| .with(filter_layer) | |
| .with(console_layer) | |
| .try_init(); | |
| info!("Logger initialized (stdout only for cloud deployment)"); | |
| } | |
| /// Log info message (backward compatible interface) | |
| pub fn log_info(message: &str) { | |
| info!("{}", message); | |
| } | |
| /// Log warning message (backward compatible interface) | |
| pub fn log_warn(message: &str) { | |
| warn!("{}", message); | |
| } | |
| /// Log error message (backward compatible interface) | |
| pub fn log_error(message: &str) { | |
| error!("{}", message); | |
| } | |
| /// Clear logs (no-op for cloud deployment) | |
| pub fn clear_logs() -> Result<(), String> { | |
| Ok(()) | |
| } | |