doum_cli/system/
logging.rs

1use 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
7/// 로깅 시스템 초기화
8pub fn init_logging(config: &Config) -> DoumResult<()> {
9    if !config.logging.enabled {
10        return Ok(());
11    }
12
13    // 로그 레벨 설정
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    // 로그 디렉터리 경로 가져오기
26    let log_dir = get_log_dir()?;
27
28    // 로그 디렉터리 생성
29    if !log_dir.exists() {
30        std::fs::create_dir_all(&log_dir)
31            .map_err(|e| DoumError::Config(format!("로그 디렉터리 생성 실패: {}", e)))?;
32    }
33
34    // 파일 appender 설정 (일별 로테이션, {날짜}.log 형식)
35    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    // Subscriber 설정
42    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}