musicus/crates/backend/src/logger.rs

78 lines
2 KiB
Rust
Raw Normal View History

2023-01-15 13:21:50 +01:00
use chrono::{Local, DateTime};
2021-04-26 00:33:25 +02:00
use log::{Level, LevelFilter, Log, Metadata, Record};
2023-01-15 13:21:50 +01:00
use std::{fmt::Display, sync::{Arc, Mutex}};
2021-04-26 00:33:25 +02:00
/// Register the custom logger. This will panic if called more than once.
2023-01-15 13:21:50 +01:00
pub fn register() -> Arc<Logger> {
let logger = Arc::new(Logger::default());
log::set_boxed_logger(Box::new(Arc::clone(&logger)))
2021-04-26 00:33:25 +02:00
.map(|()| log::set_max_level(LevelFilter::Info))
.unwrap();
2023-01-15 13:21:50 +01:00
logger
2021-04-26 00:33:25 +02:00
}
/// A simple logging handler that prints out all messages and caches them for
/// later access by the user interface.
2023-01-15 13:21:50 +01:00
pub struct Logger {
2021-04-26 00:33:25 +02:00
/// All messages since the start of the program.
messages: Mutex<Vec<LogMessage>>,
}
2023-01-15 13:21:50 +01:00
impl Logger {
pub fn messages(&self) -> Vec<LogMessage> {
self.messages.lock().unwrap().clone()
}
}
2021-04-26 00:33:25 +02:00
impl Default for Logger {
fn default() -> Self {
Self {
messages: Mutex::new(Vec::new()),
}
}
}
impl Log for Logger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= Level::Info
}
fn log(&self, record: &Record) {
if record.level() <= Level::Info {
let message = record.into();
println!("{}", message);
self.messages.lock().unwrap().push(message);
}
}
fn flush(&self) {}
}
/// A simplified representation of a [`Record`].
2023-01-15 13:21:50 +01:00
#[derive(Clone)]
pub struct LogMessage {
pub time: DateTime<Local>,
2021-04-26 00:33:25 +02:00
pub level: String,
pub module: String,
pub message: String,
}
impl<'a> From<&Record<'a>> for LogMessage {
fn from(record: &Record<'a>) -> Self {
Self {
2023-01-15 13:21:50 +01:00
time: Local::now(),
2021-04-26 00:33:25 +02:00
level: record.level().to_string(),
module: String::from(record.module_path().unwrap_or_else(|| record.target())),
message: format!("{}", record.args()),
}
}
}
impl Display for LogMessage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2023-01-15 13:21:50 +01:00
write!(f, "{} {} ({}): {}", self.time, self.module, self.level, self.message)
2021-04-26 00:33:25 +02:00
}
}