use log::{LogLevelFilter, LogMetadata, LogRecord, SetLoggerError, set_logger, Log};
use ::{SharedLogger, Config};
pub struct CombinedLogger {
level: LogLevelFilter,
logger: Vec<Box<SharedLogger>>,
}
impl CombinedLogger {
pub fn init(logger: Vec<Box<SharedLogger>>) -> Result<(), SetLoggerError> {
set_logger(|max_log_level| {
let result = CombinedLogger::new(logger);
max_log_level.set(result.level());
result
})
}
pub fn new(logger: Vec<Box<SharedLogger>>) -> Box<CombinedLogger> {
let mut log_level = LogLevelFilter::Off;
for log in &logger {
if log_level < log.level() {
log_level = log.level();
}
}
Box::new(CombinedLogger { level: log_level, logger: logger })
}
}
impl Log for CombinedLogger {
fn enabled(&self, metadata: &LogMetadata) -> bool {
metadata.level() <= self.level
}
fn log(&self, record: &LogRecord) {
if self.enabled(record.metadata()) {
for log in &self.logger {
log.log(record);
}
}
}
}
impl SharedLogger for CombinedLogger {
fn level(&self) -> LogLevelFilter {
self.level
}
fn config(&self) -> Option<&Config>
{
None
}
fn as_log(self: Box<Self>) -> Box<Log> {
Box::new(*self)
}
}