Add debug log window

This commit is contained in:
Elias Projahn 2023-01-15 13:21:50 +01:00
parent 8b45ec4940
commit 7eb85f094f
8 changed files with 111 additions and 8 deletions

View file

@ -1,20 +1,31 @@
use chrono::{Local, DateTime};
use log::{Level, LevelFilter, Log, Metadata, Record};
use std::{fmt::Display, sync::Mutex};
use std::{fmt::Display, sync::{Arc, Mutex}};
/// Register the custom logger. This will panic if called more than once.
pub fn register() {
log::set_boxed_logger(Box::new(Logger::default()))
pub fn register() -> Arc<Logger> {
let logger = Arc::new(Logger::default());
log::set_boxed_logger(Box::new(Arc::clone(&logger)))
.map(|()| log::set_max_level(LevelFilter::Info))
.unwrap();
logger
}
/// A simple logging handler that prints out all messages and caches them for
/// later access by the user interface.
struct Logger {
pub struct Logger {
/// All messages since the start of the program.
messages: Mutex<Vec<LogMessage>>,
}
impl Logger {
pub fn messages(&self) -> Vec<LogMessage> {
self.messages.lock().unwrap().clone()
}
}
impl Default for Logger {
fn default() -> Self {
Self {
@ -40,7 +51,9 @@ impl Log for Logger {
}
/// A simplified representation of a [`Record`].
struct LogMessage {
#[derive(Clone)]
pub struct LogMessage {
pub time: DateTime<Local>,
pub level: String,
pub module: String,
pub message: String,
@ -49,6 +62,7 @@ struct LogMessage {
impl<'a> From<&Record<'a>> for LogMessage {
fn from(record: &Record<'a>) -> Self {
Self {
time: Local::now(),
level: record.level().to_string(),
module: String::from(record.module_path().unwrap_or_else(|| record.target())),
message: format!("{}", record.args()),
@ -58,6 +72,6 @@ impl<'a> From<&Record<'a>> for LogMessage {
impl Display for LogMessage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} ({}): {}", self.module, self.level, self.message)
write!(f, "{} {} ({}): {}", self.time, self.module, self.level, self.message)
}
}