#[cfg(feature = "blocking")]
mod blocking_layer;
mod config;
#[cfg(not(feature = "blocking"))]
mod non_blocking_layer;
use tracing::level_filters::LevelFilter;
use tracing_appender::rolling::Rotation;
#[cfg(feature = "blocking")]
use crate::blocking_layer::{get_console_layer, get_file_layer};
use crate::config::TracingLog;
#[cfg(not(feature = "blocking"))]
use crate::non_blocking_layer::{get_console_layer, get_file_layer};
use tracing_subscriber::Registry;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
pub fn init_tracing_log() {
let config = TracingLog::config();
let option = &config.min_level;
let console = &config.console;
let files = &config.file;
let console = get_console_layer(console);
let file_layers = files
.iter()
.map(|file| get_file_layer(file))
.collect::<Vec<_>>();
let layered = Registry::default().with(console).with(file_layers);
if let Some(level) = option {
let min_level = level_from_str(level);
layered.with(min_level).init();
} else {
layered.init();
}
#[cfg(feature = "blocking")]
tracing::debug!("blocking log enabled");
#[cfg(not(feature = "blocking"))]
tracing::debug!("non blocking log enabled");
}
fn level_from_str(level: &str) -> LevelFilter {
match level {
s if s.eq_ignore_ascii_case("error") => LevelFilter::ERROR,
s if s.eq_ignore_ascii_case("warn") => LevelFilter::WARN,
s if s.eq_ignore_ascii_case("info") => LevelFilter::INFO,
s if s.eq_ignore_ascii_case("debug") => LevelFilter::DEBUG,
s if s.eq_ignore_ascii_case("trace") => LevelFilter::TRACE,
_ => panic!("未知的`level`属性值, 可选值:`error`、`warn`、`info`、`debug`、`trace`"),
}
}
fn rotation_from_str(rotation: &str) -> Rotation {
match rotation {
s if s.eq_ignore_ascii_case("minutely") => Rotation::MINUTELY,
s if s.eq_ignore_ascii_case("hourly") => Rotation::HOURLY,
s if s.eq_ignore_ascii_case("daily") => Rotation::DAILY,
s if s.eq_ignore_ascii_case("never") => Rotation::NEVER,
_ => panic!("未知的`rotation`属性值, 可选值:`minutely`、`hourly`、`daily`、`never`"),
}
}