doum_cli/system/
logging.rs1use 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
7pub fn init_logging(config: &Config) -> Result<()> {
9 if !config.logging.enabled {
10 return Ok(());
11 }
12
13 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 let log_dir = get_log_dir()?;
27
28 if !log_dir.exists() {
30 std::fs::create_dir_all(&log_dir).context("Failed to create log directory")?;
31 }
32
33 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 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}