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