rush_sync_server/output/
logging.rs1use crate::commands::log_level::LogLevelManager;
3use crate::core::prelude::*;
4use log::{Level, Log, Metadata, Record};
5use once_cell::sync::Lazy;
6use std::sync::{Arc, Mutex};
7
8static LOG_MESSAGES: Lazy<Arc<Mutex<Vec<LogMessage>>>> =
9 Lazy::new(|| Arc::new(Mutex::new(Vec::new())));
10
11#[derive(Debug, Clone)]
12pub struct LogMessage {
13 pub level: Option<Level>,
14 pub message: String,
15}
16
17impl LogMessage {
18 pub fn new<L: Into<Option<Level>>, S: Into<String>>(level: L, message: S) -> Self {
19 Self {
20 level: level.into(),
21 message: message.into(),
22 }
23 }
24
25 pub fn formatted(&self) -> String {
27 match self.level {
28 Some(level) => format!("[{}] {}", level.to_string().to_uppercase(), self.message),
29 None => self.message.clone(),
30 }
31 }
32}
33
34pub struct AppLogger;
35
36impl AppLogger {
37 pub fn log(level: Level, message: impl Into<String>) {
38 let mut logs = LOG_MESSAGES.lock().unwrap();
39 logs.push(LogMessage::new(Some(level), message));
40 }
41
42 pub fn log_plain(message: impl Into<String>) {
43 let mut logs = LOG_MESSAGES.lock().unwrap();
44 logs.push(LogMessage::new(None, message));
45 }
46
47 pub fn get_messages() -> Result<Vec<LogMessage>> {
48 let mut logs = LOG_MESSAGES.lock().unwrap();
49 let msgs = logs.clone();
50 logs.clear();
51 Ok(msgs)
52 }
53}
54
55struct GlobalLogger;
57
58impl Log for GlobalLogger {
59 fn enabled(&self, metadata: &Metadata) -> bool {
60 metadata.level() <= Level::Trace
61 }
62
63 fn log(&self, record: &Record) {
64 if self.enabled(record.metadata()) {
65 AppLogger::log(record.level(), record.args().to_string());
66 }
67 }
68
69 fn flush(&self) {}
70}
71
72pub async fn init() -> Result<()> {
73 if log::set_boxed_logger(Box::new(GlobalLogger)).is_ok() {
74 let config_level = LogLevelManager::load_from_config().await;
76 LogLevelManager::init_with_level(config_level);
77 }
78 Ok(())
79}