doum_cli/system/
logging.rs

1use crate::system::config::Config;
2use crate::system::paths::get_log_dir;
3use anyhow::{Context, Result};
4use tracing_appender::rolling::{RollingFileAppender, Rotation};
5use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
6
7/// Initialize logging system
8pub fn init_logging(config: &Config) -> Result<()> {
9    if !config.logging.enabled {
10        return Ok(());
11    }
12
13    // Set log level
14    let level = match config.logging.level.as_str() {
15        "debug" => "debug",
16        "info" => "info",
17        "warn" => "warn",
18        "error" => "error",
19        _ => "info",
20    };
21
22    let filter = EnvFilter::try_new(format!("doum_cli={}", level))
23        .unwrap_or_else(|_| EnvFilter::new("info"));
24
25    // Get log directory path
26    let log_dir = get_log_dir()?;
27
28    // Create log directory if it doesn't exist
29    if !log_dir.exists() {
30        std::fs::create_dir_all(&log_dir).context("Failed to create log directory")?;
31    }
32
33    // Set up rolling file appender (daily rotation)
34    let file_appender = RollingFileAppender::builder()
35        .rotation(Rotation::DAILY)
36        .filename_suffix("log")
37        .build(&log_dir)
38        .context("Failed to create log file appender")?;
39
40    // Initialize tracing subscriber
41    tracing_subscriber::registry()
42        .with(filter)
43        .with(
44            fmt::layer()
45                .with_writer(file_appender)
46                .with_ansi(false)
47                .with_target(false),
48        )
49        .try_init()
50        .context("Failed to initialize logging subscriber")?;
51
52    tracing::info!("Configured logging with level: {}", level);
53    Ok(())
54}