1#[cfg(feature = "blocking")]
70mod blocking_layer;
71mod config;
72#[cfg(not(feature = "blocking"))]
73mod non_blocking_layer;
74
75use tracing::level_filters::LevelFilter;
76use tracing_appender::rolling::Rotation;
77#[cfg(feature = "blocking")]
78use crate::blocking_layer::{get_console_layer, get_file_layer};
79use crate::config::TracingLog;
80
81#[cfg(not(feature = "blocking"))]
82use crate::non_blocking_layer::{get_console_layer, get_file_layer};
83use tracing_subscriber::Registry;
84use tracing_subscriber::layer::SubscriberExt;
85use tracing_subscriber::util::SubscriberInitExt;
86
87pub fn init_tracing_log() {
88 let config = TracingLog::config();
89 let console = &config.console;
90 let files = &config.file;
91
92 let console = get_console_layer(console);
93
94 let file_layers = files
95 .iter()
96 .map(|file| get_file_layer(file))
97 .collect::<Vec<_>>();
98
99 Registry::default().with(console).with(file_layers).init();
100
101 #[cfg(feature = "blocking")]
102 tracing::debug!("blocking log enabled");
103
104 #[cfg(not(feature = "blocking"))]
105 tracing::debug!("non blocking log enabled");
106}
107
108
109
110fn level_from_str(level: &str) -> LevelFilter {
111 match level {
112 s if s.eq_ignore_ascii_case("error") => LevelFilter::ERROR,
113 s if s.eq_ignore_ascii_case("warn") => LevelFilter::WARN,
114 s if s.eq_ignore_ascii_case("info") => LevelFilter::INFO,
115 s if s.eq_ignore_ascii_case("debug") => LevelFilter::DEBUG,
116 s if s.eq_ignore_ascii_case("trace") => LevelFilter::TRACE,
117 _ => panic!("未知的`level`属性值, 可选值:`error`、`warn`、`info`、`debug`、`trace`"),
118 }
119}
120
121fn rotation_from_str(rotation: &str) -> Rotation {
122 match rotation {
123 s if s.eq_ignore_ascii_case("minutely") => Rotation::MINUTELY,
124 s if s.eq_ignore_ascii_case("hourly") => Rotation::HOURLY,
125 s if s.eq_ignore_ascii_case("daily") => Rotation::DAILY,
126 s if s.eq_ignore_ascii_case("never") => Rotation::NEVER,
127 _ => panic!("未知的`rotation`属性值, 可选值:`minutely`、`hourly`、`daily`、`never`"),
128 }
129}