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