#[cfg(feature = "color")]
mod color;
#[cfg(feature = "panic")]
mod panic;
mod config;
pub use config::Config;
pub use log::LevelFilter;
pub use log::{error, warn, info, debug, trace};
pub fn init(config: Config) -> Result<(), log::SetLoggerError> {
let level = config.level;
let logger = Box::new(Logger { config });
log::set_boxed_logger(logger).map(|()| {
log::set_max_level(level);
#[cfg(feature = "panic")]
panic::install_panic_hook();
})
}
pub fn init_with_level(level: log::LevelFilter) -> Result<(), log::SetLoggerError> {
init(Config { level, .. Default::default() })
}
pub fn init_with_default() -> Result<(), log::SetLoggerError> {
init(Default::default())
}
struct Logger {
config: Config
}
impl log::Log for Logger {
#[inline]
fn enabled(&self, metadata: &log::Metadata) -> bool {
self.config.level >= metadata.level()
}
fn log(&self, record: &log::Record) {
if !self.enabled(record.metadata()) {
return;
}
#[cfg(feature = "chrono")]
let time = chrono::Local::now().format(&self.config.datetime_format);
#[cfg(not(feature = "chrono"))]
let time = "";
#[cfg(feature = "color")]
let (sgr_in, sgr_out) = if color::color_enabled(&self.config) {
color::get_colors(record.level())
} else {
("", "")
};
#[cfg(not(feature = "color"))]
let (sgr_in, sgr_out) = ("", "");
println!("{}[{}{:5}{}] {}", time, sgr_in, record.level(), sgr_out, record.args());
}
#[inline]
fn flush(&self) {
use std::io::Write;
std::io::stdout().flush().unwrap()
}
}
#[cfg(test)]
mod tests {
use log::*;
use super::*;
#[test]
fn it_works() {
init_with_level(log::LevelFilter::max()).unwrap();
error!("Error!");
warn!("Warn!");
info!("Info!");
debug!("Debug!");
trace!("Trace!");
}
}