1use log::{debug, error, info, warn, Level, LevelFilter};
4use std::sync::Arc;
5
6pub trait Logger: Send + Sync {
8 fn log(&self, level: Level, target: &str, message: &str);
10
11 fn set_level(&mut self, level: LevelFilter);
13
14 fn level(&self) -> LevelFilter;
16}
17
18pub struct SimpleLogger {
20 level: LevelFilter,
22}
23
24impl SimpleLogger {
25 pub fn new(level: LevelFilter) -> Self {
27 Self { level }
28 }
29}
30
31impl Logger for SimpleLogger {
32 fn log(&self, level: Level, target: &str, message: &str) {
33 match level {
34 Level::Error => error!(target: target, "{message}"),
35 Level::Warn => warn!(target: target, "{message}"),
36 Level::Info => info!(target: target, "{message}"),
37 Level::Debug => debug!(target: target, "{message}"),
38 Level::Trace => log::trace!(target: target, "{message}"),
39 }
40 }
41
42 fn set_level(&mut self, level: LevelFilter) {
43 self.level = level;
44 }
45
46 fn level(&self) -> LevelFilter {
47 self.level
48 }
49}
50
51pub struct ThreadLogger {
53 inner: Arc<dyn Logger>,
55 thread_id: u32,
57}
58
59impl ThreadLogger {
60 pub fn new(thread_id: u32, inner: Arc<dyn Logger>) -> Self {
62 Self { inner, thread_id }
63 }
64
65 pub fn error(&self, message: &str) {
67 self.inner
68 .log(Level::Error, &format!("Thread {}", self.thread_id), message);
69 }
70
71 pub fn warn(&self, message: &str) {
73 self.inner
74 .log(Level::Warn, &format!("Thread {}", self.thread_id), message);
75 }
76
77 pub fn info(&self, message: &str) {
79 self.inner
80 .log(Level::Info, &format!("Thread {}", self.thread_id), message);
81 }
82
83 pub fn debug(&self, message: &str) {
85 self.inner
86 .log(Level::Debug, &format!("Thread {}", self.thread_id), message);
87 }
88
89 pub fn trace(&self, message: &str) {
91 self.inner
92 .log(Level::Trace, &format!("Thread {}", self.thread_id), message);
93 }
94}