1mod logger;
6mod msg;
7mod setting;
8mod time;
9
10pub use logger::*;
11pub use setting::Setting;
12
13#[cfg(feature = "async")]
14pub use async_log::*;
15#[cfg(not(feature = "async"))]
16pub use log::*;
17
18use lazy_static::lazy_static;
19#[cfg(not(feature = "async"))]
20use std::sync::Mutex;
21#[cfg(feature = "async")]
22use tokio;
23#[cfg(feature = "async")]
24use tokio::sync::Mutex;
25
26lazy_static! {
27 pub static ref LOGGER: Mutex<Logger> = Mutex::new(Logger::new());
30}
31
32#[macro_export]
34macro_rules! func {
35 () => {{
36 fn f() {}
37 fn type_name_of<T>(_: T) -> &'static str {
38 std::any::type_name::<T>()
39 }
40 let name = type_name_of(f);
41 name.strip_suffix("::f")
45 .unwrap()
46 .rsplit("::")
47 .find(|&part| part != "{{closure}}")
48 .expect("Short function name")
49 }};
50}
51
52#[macro_export]
54macro_rules! position {
55 () => {{
56 let function = $crate::func!();
57 let file = file!();
58 let line = line!();
59 format!("{} @ {}:{}", function, file, line)
60 }};
61}
62
63#[cfg(feature = "async")]
64mod async_log {
65 use super::*;
66
67 pub async fn init(setting: Setting) {
69 let mut logger = LOGGER.lock().await;
72 logger.init(setting).await;
75 }
76
77 pub async fn clean_log() {
79 let mut writer = LOGGER.lock().await;
82 writer.clear_dir().await;
85 }
86
87 #[macro_export]
90 macro_rules! error {
91 ($($arg:tt)*) => {
92 let position = $crate::position!().to_string();
93 $crate::LOGGER.lock().await.error(format!($($arg)*).as_str(), position).await;
94 };
95 }
96
97 #[macro_export]
100 macro_rules! warn {
101 ($($arg:tt)*) => {
102 let position = $crate::position!().to_string();
103 $crate::LOGGER.lock().await.warn(format!($($arg)*).as_str(), position).await;
104 };
105 }
106
107 #[macro_export]
110 macro_rules! info {
111 ($($arg:tt)*) => {
112 let position = $crate::position!().to_string();
113 $crate::LOGGER.lock().await.info(format!($($arg)*).as_str(), position).await;
114 };
115 }
116
117 #[macro_export]
120 macro_rules! debug {
121 ($($arg:tt)*) => {
122 let position = $crate::position!().to_string();
123 $crate::LOGGER.lock().await.debug(format!($($arg)*).as_str(), position).await;
124 };
125 }
126
127 #[macro_export]
130 macro_rules! trace {
131 ($($arg:tt)*) => {
132 let position = $crate::position!().to_string();
133 $crate::LOGGER.lock().await.trace(format!($($arg)*).as_str(), position).await;
134 };
135 }
136
137 #[macro_export]
139 macro_rules! log {
140 ($level:expr, $($arg:tt)*) => {
142 let position = $crate::position!().to_string();
143 $crate::LOGGER.lock().await.record($level, &format!($($arg)*), position).await;
144 }
145 }
146
147 pub async fn enable_log() {
149 let mut writer = LOGGER.lock().await;
152 writer.enable();
154 }
155
156 pub async fn disable_log() {
158 let mut writer = LOGGER.lock().await;
161 writer.disable();
163 }
164}
165
166#[cfg(not(feature = "async"))]
167mod log {
168 use super::*;
169
170 #[macro_export]
173 macro_rules! error {
174 ($($arg:tt)*) => {
175 let position = $crate::position!().to_string();
176 $crate::LOGGER.lock().expect("Cannot lock the logger.").error(&format!($($arg)*), position);
177 };
178 }
179
180 #[macro_export]
183 macro_rules! warn {
184 ($($arg:tt)*) => {
185 let position = $crate::position!().to_string();
186 $crate::LOGGER.lock().expect("Cannot lock the logger.").warn(&format!($($arg)*), position);
187 };
188 }
189
190 #[macro_export]
193 macro_rules! info {
194 ($($arg:tt)*) => {
195 let position = $crate::position!().to_string();
196 $crate::LOGGER.lock().expect("Cannot lock the logger.").info(&format!($($arg)*), position);
197 };
198 }
199
200 #[macro_export]
203 macro_rules! debug {
204 ($($arg:tt)*) => {
205 let position = $crate::position!().to_string();
206 $crate::LOGGER.lock().expect("Cannot lock the logger.").debug(&format!($($arg)*), position);
207 };
208 }
209
210 #[macro_export]
213 macro_rules! trace {
214 ($($arg:tt)*) => {
215 let position = $crate::position!().to_string();
216 $crate::LOGGER.lock().expect("Cannot lock the logger.").trace(&format!($($arg)*), position);
217 };
218 }
219
220 #[macro_export]
221 macro_rules! log {
222 ($level:expr, $($arg:tt)*) => {
223 let position = $crate::position!().to_string();
224 $crate::LOGGER.lock().expect("Cannot lock the logger.").record($level, &format!($($arg)*), position);
225 }
226 }
227
228 pub fn init(setting: Setting) {
230 let mut logger = LOGGER.lock().unwrap();
231 logger.init(setting);
232 }
233
234 pub fn clean_log() {
236 let mut writer = LOGGER.lock().expect("Cannot lock the logger.");
237 writer.clear_dir();
238 }
239
240 pub fn enable_log() {
242 let mut writer = LOGGER.lock().expect("Cannot lock the logger.");
244 writer.enable();
246 }
247
248 pub fn disable_log() {
250 let mut writer = LOGGER.lock().expect("Cannot lock the logger.");
252 writer.disable();
254 }
255}
256
257#[derive(Copy, Clone, Debug)]
261pub enum LogLevel {
262 Trace = 0,
263 Debug = 1,
264 Info = 2,
265 Warn = 3,
266 Error = 4,
267}
268
269impl std::fmt::Display for LogLevel {
270 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
271 match self {
272 LogLevel::Info => write!(f, "INFO "),
273 LogLevel::Debug => write!(f, "DEBUG"),
274 LogLevel::Warn => write!(f, "WARN "),
275 LogLevel::Error => write!(f, "ERROR"),
276 LogLevel::Trace => write!(f, "TRACE"),
277 }
278 }
279}
280
281impl LogLevel {
282 pub fn get_level(&self) -> usize {
283 *self as usize
284 }
285}
286
287unsafe impl Send for LogLevel {}