logger.rs 868 B

123456789101112131415161718192021222324252627282930313233343536
  1. use once_cell::sync::OnceCell;
  2. use parking_lot::Mutex;
  3. use std::{collections::VecDeque, sync::Arc};
  4. const LOGS_QUEUE_LEN: usize = 100;
  5. pub struct Logger {
  6. log_data: Arc<Mutex<VecDeque<String>>>,
  7. }
  8. impl Logger {
  9. pub fn global() -> &'static Logger {
  10. static LOGGER: OnceCell<Logger> = OnceCell::new();
  11. LOGGER.get_or_init(|| Logger {
  12. log_data: Arc::new(Mutex::new(VecDeque::with_capacity(LOGS_QUEUE_LEN + 10))),
  13. })
  14. }
  15. pub fn get_log(&self) -> VecDeque<String> {
  16. self.log_data.lock().clone()
  17. }
  18. pub fn set_log(&self, text: String) {
  19. let mut logs = self.log_data.lock();
  20. if logs.len() > LOGS_QUEUE_LEN {
  21. logs.pop_front();
  22. }
  23. logs.push_back(text);
  24. }
  25. pub fn clear_log(&self) {
  26. let mut logs = self.log_data.lock();
  27. logs.clear();
  28. }
  29. }