1use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum LogLevel {
13 Trace,
15 Debug,
17 Info,
19 Warn,
21 Error,
23}
24
25impl LogLevel {
26 pub fn as_str(&self) -> &'static str {
28 match self {
29 LogLevel::Debug => "debug",
30 LogLevel::Info => "info",
31 LogLevel::Warn => "warn",
32 LogLevel::Error => "error",
33 LogLevel::Trace => "trace",
34 }
35 }
36}
37
38impl From<&str> for LogLevel {
39 fn from(s: &str) -> Self {
40 match s.to_lowercase().as_str() {
41 "trace" => LogLevel::Trace,
42 "debug" => LogLevel::Debug,
43 "info" => LogLevel::Info,
44 "warn" => LogLevel::Warn,
45 "error" => LogLevel::Error,
46 _ => LogLevel::Info,
47 }
48 }
49}
50
51pub fn create_logger_layer<S>(
77 level: &str,
78 filter_crate_only: bool,
79) -> impl Layer<S> + Send + Sync + 'static
80where
81 S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
82{
83 let log_level = LogLevel::from(level);
84
85 let filter = if filter_crate_only {
87 EnvFilter::new(format!("tqsdk_rs={}", log_level.as_str()))
89 } else {
90 EnvFilter::new(log_level.as_str())
92 };
93
94 fmt::layer()
96 .with_target(true)
97 .with_thread_ids(false)
98 .with_thread_names(false)
99 .with_line_number(true)
100 .with_file(true)
101 .with_ansi(true)
102 .with_timer(fmt::time::OffsetTime::local_rfc_3339().expect("无法获取本地时区"))
103 .compact()
104 .with_filter(filter)
105}
106
107pub fn init_logger(level: &str, filter_crate_only: bool) {
126 let layer = create_logger_layer(level, filter_crate_only);
127
128 let _ = tracing_subscriber::registry()
131 .with(layer)
132 .try_init();
133}
134
135pub fn init_default_logger() {
139 init_logger("info", true);
140}
141
142#[cfg(test)]
143mod tests {
144 use super::*;
145
146 #[test]
147 fn test_log_level_from_str() {
148 assert_eq!(LogLevel::from("Trace"), LogLevel::Trace);
149 assert_eq!(LogLevel::from("debug"), LogLevel::Debug);
150 assert_eq!(LogLevel::from("DEBUG"), LogLevel::Debug);
151 assert_eq!(LogLevel::from("info"), LogLevel::Info);
152 assert_eq!(LogLevel::from("warn"), LogLevel::Warn);
153 assert_eq!(LogLevel::from("error"), LogLevel::Error);
154 assert_eq!(LogLevel::from("unknown"), LogLevel::Info); }
156
157 #[test]
158 fn test_log_level_as_str() {
159 assert_eq!(LogLevel::Debug.as_str(), "debug");
160 assert_eq!(LogLevel::Info.as_str(), "info");
161 assert_eq!(LogLevel::Warn.as_str(), "warn");
162 assert_eq!(LogLevel::Error.as_str(), "error");
163 assert_eq!(LogLevel::Trace.as_str(), "trace");
164 }
165}