use std::path::PathBuf;
use tracing::Level;
use tracing_subscriber::{
fmt::{self},
EnvFilter,
prelude::*,
};
pub fn init_logging(
log_level: Option<Level>,
log_file: Option<PathBuf>,
) -> anyhow::Result<()> {
let level = log_level.unwrap_or(Level::INFO);
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
EnvFilter::new(format!("info,{}", level.as_str().to_lowercase()))
});
let console_layer = fmt::layer()
.with_target(false)
.with_thread_ids(false)
.with_thread_names(false)
.with_ansi(true)
.with_file(true)
.with_line_number(true);
let subscriber =
tracing_subscriber::registry().with(env_filter).with(console_layer);
if let Some(log_file) = log_file {
let directory =
log_file.parent().unwrap_or(&PathBuf::from(".")).to_path_buf();
let file_appender =
tracing_appender::rolling::RollingFileAppender::builder()
.rotation(tracing_appender::rolling::Rotation::DAILY)
.filename_prefix("moduforge")
.filename_suffix("log")
.build(&directory)?;
let file_layer = fmt::layer()
.with_target(false)
.with_thread_ids(false)
.with_thread_names(false)
.with_ansi(false)
.with_file(true)
.with_line_number(true)
.with_writer(file_appender);
subscriber.with(file_layer).init();
} else {
subscriber.init();
}
Ok(())
}
pub fn get_log_level() -> Level {
tracing::level_filters::LevelFilter::current()
.into_level()
.unwrap_or(Level::INFO)
}
pub fn set_log_level(level: Level) {
tracing_subscriber::filter::LevelFilter::from_level(level);
}