use crate::filter::Filter;
use crate::formatter::Format;
use crate::sink::Sink;
use log::{Log, Metadata, Record, SetLoggerError};
pub struct ProLogger {
pub(crate) filter: Filter,
pub(crate) formatter: Box<dyn Format>,
pub(crate) sinks: Vec<Box<dyn Sink>>,
}
impl ProLogger {
pub fn builder() -> crate::builder::ProLoggerBuilder {
crate::builder::ProLoggerBuilder::new()
}
pub fn init(self) -> Result<(), SetLoggerError> {
let max_level = self.filter.global_level();
log::set_boxed_logger(Box::new(self)).map(|()| log::set_max_level(max_level))
}
}
unsafe impl Send for ProLogger {}
unsafe impl Sync for ProLogger {}
impl Log for ProLogger {
fn enabled(&self, metadata: &Metadata) -> bool {
self.filter.is_enabled(metadata)
}
fn log(&self, record: &Record) {
if !self.enabled(record.metadata()) {
return;
}
for sink in &self.sinks {
sink.write(record, self.formatter.as_ref());
}
}
fn flush(&self) {
for sink in &self.sinks {
sink.flush();
}
}
}
impl std::fmt::Debug for ProLogger {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ProLogger")
.field("filter", &self.filter)
.field("sinks_count", &self.sinks.len())
.finish()
}
}