use slog::{Drain, Logger};
#[derive(Debug, Clone)]
pub struct Log {
logger: Option<Logger>,
level: log::Level,
}
impl Default for Log {
fn default() -> Self {
Self::new()
}
}
impl Log {
pub fn new() -> Self {
Log {
logger: None,
level: log::Level::Info,
}
}
pub fn logger(&self) -> Self {
let logger = if true {
let drain = slog_json::Json::new(std::io::stdout())
.add_default_keys()
.build()
.fuse();
let drain = slog_async::Async::new(drain).build().fuse();
slog::Logger::root(drain, slog::o!())
} else {
let decorator = slog_term::TermDecorator::new().build();
let drain = slog_term::FullFormat::new(decorator).build().fuse();
let drain = slog_async::Async::new(drain).build().fuse();
slog::Logger::root(drain, slog::o!())
};
Self {
logger: Some(logger),
level: self.level,
}
}
pub fn guard(&self) -> slog_scope::GlobalLoggerGuard {
slog_scope::set_global_logger(self.logger.clone().unwrap())
}
pub fn set_level(&mut self, debug: bool) -> Self {
if debug {
self.level = log::Level::Debug;
}
slog_stdlog::init_with_level(self.level).expect("Could not set log level");
self.clone()
}
}