moduforge_core/
logging.rs1use std::path::PathBuf;
2use tracing::Level;
3use tracing_subscriber::{
4 fmt::{self},
5 EnvFilter,
6 prelude::*,
7};
8
9pub fn init_logging(
15 log_level: Option<Level>,
16 log_file: Option<PathBuf>,
17) -> anyhow::Result<()> {
18 let level = log_level.unwrap_or(Level::INFO);
20 let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
21 EnvFilter::new(format!("info,{}", level.as_str().to_lowercase()))
22 });
23
24 let console_layer = fmt::layer()
26 .with_target(false)
27 .with_thread_ids(false)
28 .with_thread_names(false)
29 .with_ansi(true)
30 .with_file(true)
31 .with_line_number(true);
32
33 let subscriber =
35 tracing_subscriber::registry().with(env_filter).with(console_layer);
36
37 if let Some(log_file) = log_file {
39 let directory =
40 log_file.parent().unwrap_or(&PathBuf::from(".")).to_path_buf();
41 let file_appender =
42 tracing_appender::rolling::RollingFileAppender::builder()
43 .rotation(tracing_appender::rolling::Rotation::DAILY)
44 .filename_prefix("moduforge")
45 .filename_suffix("log")
46 .build(&directory)?;
47
48 let file_layer = fmt::layer()
49 .with_target(false)
50 .with_thread_ids(false)
51 .with_thread_names(false)
52 .with_ansi(false)
53 .with_file(true)
54 .with_line_number(true)
55 .with_writer(file_appender);
56
57 subscriber.with(file_layer).init();
58 } else {
59 subscriber.init();
60 }
61
62 Ok(())
63}
64
65pub fn get_log_level() -> Level {
67 tracing::level_filters::LevelFilter::current()
68 .into_level()
69 .unwrap_or(Level::INFO)
70}
71
72pub fn set_log_level(level: Level) {
74 tracing_subscriber::filter::LevelFilter::from_level(level);
75}