use chrono::Local;
use log::LevelFilter;
use simplelog::{self, CombinedLogger, TermLogger, WriteLogger};
use std::fs::OpenOptions;
use std::io::Write;
pub fn setup_logging(log_level: LevelFilter, log_file: Option<&str>) -> std::io::Result<String> {
let log_config = simplelog::Config::default();
if log_file == Some("memory") {
TermLogger::init(
log_level,
log_config,
simplelog::TerminalMode::Stderr,
simplelog::ColorChoice::Auto,
)
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
log::info!("Logging initialized to stderr only (memory mode)");
log::debug!("Debug logging enabled");
return Ok(String::from("stderr-only (memory mode)"));
}
let timestamp = Local::now().format("%Y%m%d_%H").to_string();
let log_path = match log_file {
Some(path) => path.to_string(),
None => format!("gmail_mcp_{}.log", timestamp),
};
let mut log_file = OpenOptions::new()
.create(true)
.append(true)
.open(&log_path)?;
writeln!(
log_file,
"====== GMAIL MCP SERVER LOG - Started at {} ======",
Local::now().format("%Y-%m-%d %H:%M:%S")
)?;
CombinedLogger::init(vec![
WriteLogger::new(log_level, log_config.clone(), log_file),
TermLogger::new(
log_level,
log_config,
simplelog::TerminalMode::Stderr,
simplelog::ColorChoice::Auto,
),
])
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
log::info!("Logging initialized to file: {} and stderr", log_path);
log::debug!("Debug logging enabled");
Ok(log_path)
}