use crate::{Config, SharedLogger};
use log::{set_boxed_logger, set_max_level, LevelFilter, Log, Metadata, Record, SetLoggerError};
pub struct CombinedLogger {
level: LevelFilter,
logger: Vec<Box<dyn SharedLogger>>,
}
impl CombinedLogger {
pub fn init(logger: Vec<Box<dyn SharedLogger>>) -> Result<(), SetLoggerError> {
let comblog = CombinedLogger::new(logger);
set_max_level(comblog.level());
set_boxed_logger(comblog)
}
pub fn new(logger: Vec<Box<dyn SharedLogger>>) -> Box<CombinedLogger> {
let mut log_level = LevelFilter::Off;
for log in &logger {
if log_level < log.level() {
log_level = log.level();
}
}
Box::new(CombinedLogger {
level: log_level,
logger,
})
}
}
impl Log for CombinedLogger {
fn enabled(&self, metadata: &Metadata<'_>) -> bool {
metadata.level() <= self.level
}
fn log(&self, record: &Record<'_>) {
if self.enabled(record.metadata()) {
for log in &self.logger {
log.log(record);
}
}
}
fn flush(&self) {
for log in &self.logger {
log.flush();
}
}
}
impl SharedLogger for CombinedLogger {
fn level(&self) -> LevelFilter {
self.level
}
fn config(&self) -> Option<&Config> {
None
}
fn as_log(self: Box<Self>) -> Box<dyn Log> {
Box::new(*self)
}
}