1#[macro_export]
36macro_rules! log_trace {
37 ($msg:literal, component = $component:expr) => {
39 log::trace!(component = $component; $msg);
40 };
41 ($fmt:literal, $($args:expr),+, component = $component:expr) => {
42 log::trace!(component = $component; $fmt, $($args),+);
43 };
44
45 ($msg:literal, color = $color:expr) => {
47 log::trace!(color = $color as u8; $msg);
48 };
49 ($fmt:literal, $($args:expr),+, color = $color:expr) => {
50 log::trace!(color = $color as u8; $fmt, $($args),+);
51 };
52
53 ($msg:literal, color = $color:expr, component = $component:expr) => {
55 log::trace!(component = $component, color = $color as u8; $msg);
56 };
57 ($fmt:literal, $($args:expr),+, color = $color:expr, component = $component:expr) => {
58 log::trace!(component = $component, color = $color as u8; $fmt, $($args),+);
59 };
60
61 ($msg:literal, component = $component:expr, color = $color:expr) => {
63 log::trace!(component = $component, color = $color as u8; $msg);
64 };
65 ($fmt:literal, $($args:expr),+, component = $component:expr, color = $color:expr) => {
66 log::trace!(component = $component, color = $color as u8; $fmt, $($args),+);
67 };
68
69 ($msg:literal) => {
71 log::trace!(color = $crate::enums::LogColor::Normal as u8; $msg);
72 };
73 ($fmt:literal, $($args:expr),+) => {
74 log::trace!(color = $crate::enums::LogColor::Normal as u8; $fmt, $($args),+);
75 };
76}
77
78#[macro_export]
96macro_rules! log_debug {
97 ($msg:literal, component = $component:expr) => {
99 log::debug!(component = $component; $msg);
100 };
101 ($fmt:literal, $($args:expr),+, component = $component:expr) => {
102 log::debug!(component = $component; $fmt, $($args),+);
103 };
104
105 ($msg:literal, color = $color:expr) => {
107 log::debug!(color = $color as u8; $msg);
108 };
109 ($fmt:literal, $($args:expr),+, color = $color:expr) => {
110 log::debug!(color = $color as u8; $fmt, $($args),+);
111 };
112
113 ($msg:literal, color = $color:expr, component = $component:expr) => {
115 log::debug!(component = $component, color = $color as u8; $msg);
116 };
117 ($fmt:literal, $($args:expr),+, color = $color:expr, component = $component:expr) => {
118 log::debug!(component = $component, color = $color as u8; $fmt, $($args),+);
119 };
120
121 ($msg:literal, component = $component:expr, color = $color:expr) => {
123 log::debug!(component = $component, color = $color as u8; $msg);
124 };
125 ($fmt:literal, $($args:expr),+, component = $component:expr, color = $color:expr) => {
126 log::debug!(component = $component, color = $color as u8; $fmt, $($args),+);
127 };
128
129 ($msg:literal) => {
131 log::debug!(color = $crate::enums::LogColor::Normal as u8; $msg);
132 };
133 ($fmt:literal, $($args:expr),+) => {
134 log::debug!(color = $crate::enums::LogColor::Normal as u8; $fmt, $($args),+);
135 };
136}
137
138#[macro_export]
156macro_rules! log_info {
157 ($msg:literal, color = $color:expr, component = $component:expr) => {
159 log::info!(component = $component, color = $color as u8; $msg);
160 };
161 ($fmt:literal, $arg1:expr, color = $color:expr, component = $component:expr) => {
162 log::info!(component = $component, color = $color as u8; $fmt, $arg1);
163 };
164 ($fmt:literal, $arg1:expr, $arg2:expr, color = $color:expr, component = $component:expr) => {
165 log::info!(component = $component, color = $color as u8; $fmt, $arg1, $arg2);
166 };
167
168 ($msg:literal, component = $component:expr, color = $color:expr) => {
170 log::info!(component = $component, color = $color as u8; $msg);
171 };
172 ($fmt:literal, $arg1:expr, component = $component:expr, color = $color:expr) => {
173 log::info!(component = $component, color = $color as u8; $fmt, $arg1);
174 };
175 ($fmt:literal, $arg1:expr, $arg2:expr, component = $component:expr, color = $color:expr) => {
176 log::info!(component = $component, color = $color as u8; $fmt, $arg1, $arg2);
177 };
178
179 ($msg:literal, component = $component:expr) => {
181 log::info!(component = $component; $msg);
182 };
183 ($fmt:literal, $arg1:expr, component = $component:expr) => {
184 log::info!(component = $component; $fmt, $arg1);
185 };
186 ($fmt:literal, $arg1:expr, $arg2:expr, component = $component:expr) => {
187 log::info!(component = $component; $fmt, $arg1, $arg2);
188 };
189
190 ($msg:literal, color = $color:expr) => {
192 log::info!(color = $color as u8; $msg);
193 };
194 ($fmt:literal, $arg1:expr, color = $color:expr) => {
195 log::info!(color = $color as u8; $fmt, $arg1);
196 };
197 ($fmt:literal, $arg1:expr, $arg2:expr, color = $color:expr) => {
198 log::info!(color = $color as u8; $fmt, $arg1, $arg2);
199 };
200 ($fmt:literal, $arg1:expr, $arg2:expr, $arg3:expr, color = $color:expr) => {
201 log::info!(color = $color as u8; $fmt, $arg1, $arg2, $arg3);
202 };
203
204 ($msg:literal) => {
206 log::info!(color = $crate::enums::LogColor::Normal as u8; $msg);
207 };
208 ($fmt:literal, $($args:expr),+) => {
209 log::info!(color = $crate::enums::LogColor::Normal as u8; $fmt, $($args),+);
210 };
211}
212
213#[macro_export]
231macro_rules! log_warn {
232 ($msg:literal, color = $color:expr, component = $component:expr) => {
234 log::warn!(component = $component, color = $color as u8; $msg);
235 };
236 ($fmt:literal, $arg1:expr, color = $color:expr, component = $component:expr) => {
237 log::warn!(component = $component, color = $color as u8; $fmt, $arg1);
238 };
239 ($fmt:literal, $arg1:expr, $arg2:expr, color = $color:expr, component = $component:expr) => {
240 log::warn!(component = $component, color = $color as u8; $fmt, $arg1, $arg2);
241 };
242
243 ($msg:literal, component = $component:expr, color = $color:expr) => {
245 log::warn!(component = $component, color = $color as u8; $msg);
246 };
247 ($fmt:literal, $arg1:expr, component = $component:expr, color = $color:expr) => {
248 log::warn!(component = $component, color = $color as u8; $fmt, $arg1);
249 };
250 ($fmt:literal, $arg1:expr, $arg2:expr, component = $component:expr, color = $color:expr) => {
251 log::warn!(component = $component, color = $color as u8; $fmt, $arg1, $arg2);
252 };
253
254 ($msg:literal, component = $component:expr) => {
256 log::warn!(component = $component, color = $crate::enums::LogColor::Yellow as u8; $msg);
257 };
258 ($fmt:literal, $arg1:expr, component = $component:expr) => {
259 log::warn!(component = $component, color = $crate::enums::LogColor::Yellow as u8; $fmt, $arg1);
260 };
261 ($fmt:literal, $arg1:expr, $arg2:expr, component = $component:expr) => {
262 log::warn!(component = $component, color = $crate::enums::LogColor::Yellow as u8; $fmt, $arg1, $arg2);
263 };
264
265 ($msg:literal, color = $color:expr) => {
267 log::warn!(color = $color as u8; $msg);
268 };
269 ($fmt:literal, $arg1:expr, color = $color:expr) => {
270 log::warn!(color = $color as u8; $fmt, $arg1);
271 };
272 ($fmt:literal, $arg1:expr, $arg2:expr, color = $color:expr) => {
273 log::warn!(color = $color as u8; $fmt, $arg1, $arg2);
274 };
275 ($fmt:literal, $arg1:expr, $arg2:expr, $arg3:expr, color = $color:expr) => {
276 log::warn!(color = $color as u8; $fmt, $arg1, $arg2, $arg3);
277 };
278
279 ($msg:literal) => {
281 log::warn!(color = $crate::enums::LogColor::Yellow as u8; $msg);
282 };
283 ($fmt:literal, $($args:expr),+) => {
284 log::warn!(color = $crate::enums::LogColor::Yellow as u8; $fmt, $($args),+);
285 };
286}
287
288#[macro_export]
306macro_rules! log_error {
307 ($msg:literal, color = $color:expr, component = $component:expr) => {
309 log::error!(component = $component, color = $color as u8; $msg);
310 };
311 ($fmt:literal, $arg1:expr, color = $color:expr, component = $component:expr) => {
312 log::error!(component = $component, color = $color as u8; $fmt, $arg1);
313 };
314 ($fmt:literal, $arg1:expr, $arg2:expr, color = $color:expr, component = $component:expr) => {
315 log::error!(component = $component, color = $color as u8; $fmt, $arg1, $arg2);
316 };
317
318 ($msg:literal, component = $component:expr, color = $color:expr) => {
320 log::error!(component = $component, color = $color as u8; $msg);
321 };
322 ($fmt:literal, $arg1:expr, component = $component:expr, color = $color:expr) => {
323 log::error!(component = $component, color = $color as u8; $fmt, $arg1);
324 };
325 ($fmt:literal, $arg1:expr, $arg2:expr, component = $component:expr, color = $color:expr) => {
326 log::error!(component = $component, color = $color as u8; $fmt, $arg1, $arg2);
327 };
328
329 ($msg:literal, component = $component:expr) => {
331 log::error!(component = $component, color = $crate::enums::LogColor::Red as u8; $msg);
332 };
333 ($fmt:literal, $arg1:expr, component = $component:expr) => {
334 log::error!(component = $component, color = $crate::enums::LogColor::Red as u8; $fmt, $arg1);
335 };
336 ($fmt:literal, $arg1:expr, $arg2:expr, component = $component:expr) => {
337 log::error!(component = $component, color = $crate::enums::LogColor::Red as u8; $fmt, $arg1, $arg2);
338 };
339
340 ($msg:literal, color = $color:expr) => {
342 log::error!(color = $color as u8; $msg);
343 };
344 ($fmt:literal, $arg1:expr, color = $color:expr) => {
345 log::error!(color = $color as u8; $fmt, $arg1);
346 };
347 ($fmt:literal, $arg1:expr, $arg2:expr, color = $color:expr) => {
348 log::error!(color = $color as u8; $fmt, $arg1, $arg2);
349 };
350 ($fmt:literal, $arg1:expr, $arg2:expr, $arg3:expr, color = $color:expr) => {
351 log::error!(color = $color as u8; $fmt, $arg1, $arg2, $arg3);
352 };
353
354 ($msg:literal) => {
356 log::error!(color = $crate::enums::LogColor::Red as u8; $msg);
357 };
358 ($fmt:literal, $($args:expr),+) => {
359 log::error!(color = $crate::enums::LogColor::Red as u8; $fmt, $($args),+);
360 };
361}
362
363pub use log_debug;
365pub use log_error;
366pub use log_info;
367pub use log_trace;
368pub use log_warn;
369
370#[cfg(test)]
371mod tests {
372 use std::{thread::sleep, time::Duration};
373
374 use nautilus_core::UUID4;
375 use nautilus_model::identifiers::TraderId;
376 use rstest::*;
377 use tempfile::tempdir;
378
379 use crate::{
380 enums::LogColor,
381 logging::{
382 logger::{Logger, LoggerConfig},
383 logging_clock_set_static_mode, logging_clock_set_static_time,
384 writer::FileWriterConfig,
385 },
386 testing::wait_until,
387 };
388
389 #[rstest]
390 fn test_colored_logging_macros() {
391 let config = LoggerConfig::from_spec("stdout=Trace;fileout=Trace;is_colored").unwrap();
392
393 let temp_dir = tempdir().expect("Failed to create temporary directory");
394 let file_config = FileWriterConfig {
395 directory: Some(temp_dir.path().to_str().unwrap().to_string()),
396 ..Default::default()
397 };
398
399 let log_guard = Logger::init_with_config(
400 TraderId::from("TRADER-001"),
401 UUID4::new(),
402 config,
403 file_config,
404 )
405 .expect("Failed to initialize logger");
406
407 logging_clock_set_static_mode();
408 logging_clock_set_static_time(1_650_000_000_000_000);
409
410 log_trace!("This is a trace message", component = "TestComponent");
412 log_debug!("This is a debug message", component = "TestComponent");
413 log_info!("This is an info message", component = "TestComponent");
414 log_warn!("This is a warning message", component = "TestComponent");
415 log_error!("This is an error message", component = "TestComponent");
416
417 log_info!(
419 "Success message",
420 color = LogColor::Green,
421 component = "TestComponent"
422 );
423 log_info!(
424 "Information message",
425 color = LogColor::Blue,
426 component = "TestComponent"
427 );
428 log_warn!(
429 "Custom warning",
430 component = "TestComponent",
431 color = LogColor::Magenta
432 );
433
434 log_info!("Component test", component = "TestComponent");
436 log_warn!("Component warning", component = "TestComponent");
437
438 log_info!(
440 "Color then component",
441 color = LogColor::Cyan,
442 component = "TestComponent"
443 );
444
445 sleep(Duration::from_millis(200));
447
448 drop(log_guard);
449
450 let mut log_contents = String::new();
452 wait_until(
453 || {
454 if let Some(log_file) = std::fs::read_dir(&temp_dir)
455 .expect("Failed to read directory")
456 .filter_map(Result::ok)
457 .find(|entry| entry.path().is_file())
458 {
459 let log_file_path = log_file.path();
460 log_contents =
461 std::fs::read_to_string(log_file_path).expect("Failed to read log file");
462 !log_contents.is_empty()
463 } else {
464 false
465 }
466 },
467 Duration::from_secs(3),
468 );
469
470 if !log_contents.contains("This is a trace message") {
472 println!("File contents:\n{log_contents}");
473 }
474
475 assert!(log_contents.contains("This is a trace message"));
477 assert!(log_contents.contains("This is a debug message"));
478 assert!(log_contents.contains("This is an info message"));
479 assert!(log_contents.contains("This is a warning message"));
480 assert!(log_contents.contains("This is an error message"));
481 assert!(log_contents.contains("Success message"));
482 assert!(log_contents.contains("Information message"));
483 assert!(log_contents.contains("Custom warning"));
484
485 assert!(log_contents.contains("Component test"));
487 assert!(log_contents.contains("Component warning"));
488 assert!(log_contents.contains("Color then component"));
489 }
490}