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 min_level = &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 let min_level = level_from_str(min_level);
107 layered.with(min_level).init();
108
109 #[cfg(feature = "blocking")]
110 tracing::debug!("blocking log enabled");
111
112 #[cfg(not(feature = "blocking"))]
113 tracing::debug!("non blocking log enabled");
114}
115
116
117
118fn level_from_str(level: &str) -> LevelFilter {
119 match level {
120 s if s.eq_ignore_ascii_case("error") => LevelFilter::ERROR,
121 s if s.eq_ignore_ascii_case("warn") => LevelFilter::WARN,
122 s if s.eq_ignore_ascii_case("info") => LevelFilter::INFO,
123 s if s.eq_ignore_ascii_case("debug") => LevelFilter::DEBUG,
124 s if s.eq_ignore_ascii_case("trace") => LevelFilter::TRACE,
125 _ => panic!("未知的`level`属性值, 可选值:`error`、`warn`、`info`、`debug`、`trace`"),
126 }
127}
128
129fn rotation_from_str(rotation: &str) -> Rotation {
130 match rotation {
131 s if s.eq_ignore_ascii_case("minutely") => Rotation::MINUTELY,
132 s if s.eq_ignore_ascii_case("hourly") => Rotation::HOURLY,
133 s if s.eq_ignore_ascii_case("daily") => Rotation::DAILY,
134 s if s.eq_ignore_ascii_case("never") => Rotation::NEVER,
135 _ => panic!("未知的`rotation`属性值, 可选值:`minutely`、`hourly`、`daily`、`never`"),
136 }
137}
138
139fn level_default() -> String {
140 "info".to_string()
141}