use log::{set_boxed_logger, set_max_level, Log, SetLoggerError};
use simplelog::SharedLogger;
use std::ops::Deref;
use std::sync::{Arc, RwLock};
#[derive(Clone)]
pub struct IndirectLogger {
logger: Arc<RwLock<Box<dyn SharedLogger>>>,
}
impl IndirectLogger {
pub fn update(&self, logger: Box<dyn SharedLogger>) {
set_max_level(logger.level());
*self.logger.write().unwrap() = logger;
}
pub fn new(logger: Box<dyn SharedLogger>) -> Self {
IndirectLogger {
logger: Arc::new(RwLock::new(logger)),
}
}
pub fn init(logger: Box<dyn SharedLogger>) -> Result<Self, SetLoggerError> {
set_max_level(logger.deref().level());
let indirect_logger = IndirectLogger::new(logger);
set_boxed_logger(Box::new(indirect_logger.clone()))?;
Ok(indirect_logger)
}
}
impl Log for IndirectLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
self.logger.read().unwrap().deref().enabled(metadata)
}
fn log(&self, record: &log::Record) {
self.logger.read().unwrap().deref().log(record)
}
fn flush(&self) {
self.logger.read().unwrap().deref().flush()
}
}