doum_cli/system/
logging.rs1use crate::system::config::Config;
2use crate::system::error::{DoumError, DoumResult};
3use crate::system::paths::get_log_dir;
4use tracing_appender::rolling::{RollingFileAppender, Rotation};
5use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
6
7pub fn init_logging(config: &Config) -> DoumResult<()> {
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)
31 .map_err(|e| DoumError::Config(format!("로그 디렉터리 생성 실패: {}", e)))?;
32 }
33
34 let file_appender = RollingFileAppender::builder()
36 .rotation(Rotation::DAILY)
37 .filename_suffix("log")
38 .build(&log_dir)
39 .map_err(|e| DoumError::Config(format!("로그 파일 생성 실패: {}", e)))?;
40
41 tracing_subscriber::registry()
43 .with(filter)
44 .with(
45 fmt::layer()
46 .with_writer(file_appender)
47 .with_ansi(false)
48 .with_target(false),
49 )
50 .try_init()
51 .map_err(|e| DoumError::Config(format!("로깅 초기화 실패: {}", e)))?;
52
53 tracing::info!("로깅 시스템 초기화 완료 (레벨: {})", level);
54 Ok(())
55}