mermaid_cli/utils/
logger.rs1use std::fs::OpenOptions;
2use std::path::PathBuf;
3use tracing::{debug, error, info, warn};
4use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
5
6fn get_log_file_path() -> Option<PathBuf> {
8 std::env::var("HOME")
9 .ok()
10 .map(|home| PathBuf::from(home).join(".mermaid").join("mermaid.log"))
11}
12
13pub fn init_logger(verbose: bool) {
15 let filter = if verbose {
18 EnvFilter::new("debug,mermaid=debug")
19 } else {
20 EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("warn,mermaid=info"))
21 };
22
23 if let Some(log_path) = get_log_file_path() {
26 if let Some(parent) = log_path.parent() {
28 let _ = std::fs::create_dir_all(parent);
29 }
30
31 if let Ok(file) = OpenOptions::new()
33 .create(true)
34 .append(true)
35 .open(&log_path)
36 {
37 let fmt_layer = tracing_subscriber::fmt::layer()
38 .with_writer(file)
39 .with_target(false)
40 .with_thread_ids(false)
41 .with_thread_names(false)
42 .with_ansi(false) .compact();
44
45 tracing_subscriber::registry()
46 .with(filter)
47 .with(fmt_layer)
48 .init();
49 return;
50 }
51 }
52
53 tracing_subscriber::registry()
55 .with(filter)
56 .init();
57}
58
59pub fn log_info(category: &str, message: impl std::fmt::Display) {
61 info!(category = %category, "{}", message);
62}
63
64pub fn log_warn(category: &str, message: impl std::fmt::Display) {
66 warn!(category = %category, "{}", message);
67}
68
69pub fn log_error(category: &str, message: impl std::fmt::Display) {
71 error!(category = %category, "{}", message);
72}
73
74pub fn log_debug(message: impl std::fmt::Display) {
76 debug!("{}", message);
77}
78
79pub fn log_progress(step: usize, total: usize, message: impl std::fmt::Display) {
81 info!(step = step, total = total, "{}", message);
82}