1use chrono::Local;
2use log::LevelFilter;
3use simplelog::{self, CombinedLogger, TermLogger, WriteLogger};
4use std::fs::OpenOptions;
5use std::io::Write;
6
7pub fn setup_logging(log_level: LevelFilter, log_file: Option<&str>) -> std::io::Result<String> {
27 let log_config = simplelog::Config::default();
29
30 if log_file == Some("memory") {
32 TermLogger::init(
34 log_level,
35 log_config,
36 simplelog::TerminalMode::Stderr,
37 simplelog::ColorChoice::Auto,
38 )
39 .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
40
41 log::info!("Logging initialized to stderr only (memory mode)");
42 log::debug!("Debug logging enabled");
43
44 return Ok(String::from("stderr-only (memory mode)"));
45 }
46
47 let timestamp = Local::now().format("%Y%m%d_%H").to_string();
49
50 let log_path = match log_file {
52 Some(path) => path.to_string(),
53 None => format!("gmail_mcp_{}.log", timestamp),
54 };
55
56 let mut log_file = OpenOptions::new()
58 .create(true)
59 .append(true)
60 .open(&log_path)?;
61
62 writeln!(
63 log_file,
64 "====== GMAIL MCP SERVER LOG - Started at {} ======",
65 Local::now().format("%Y-%m-%d %H:%M:%S")
66 )?;
67
68 CombinedLogger::init(vec![
70 WriteLogger::new(log_level, log_config.clone(), log_file),
72 TermLogger::new(
74 log_level,
75 log_config,
76 simplelog::TerminalMode::Stderr,
77 simplelog::ColorChoice::Auto,
78 ),
79 ])
80 .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
81
82 log::info!("Logging initialized to file: {} and stderr", log_path);
83 log::debug!("Debug logging enabled");
84
85 Ok(log_path)
86}