#![deny(missing_docs, rust_2018_idioms)]
mod config;
mod loggers;
pub use self::config::{Config, ConfigBuilder, LevelPadding};
#[cfg(feature = "test")]
pub use self::loggers::TestLogger;
pub use self::loggers::{CombinedLogger, SimpleLogger, WriteLogger};
#[cfg(feature = "term")]
pub use self::loggers::{TermLogError, TermLogger, TerminalMode};
pub use log::{Level, LevelFilter};
use log::Log;
#[cfg(test)]
use log::*;
pub trait SharedLogger: Log {
fn level(&self) -> LevelFilter;
fn config(&self) -> Option<&Config>;
fn as_log(self: Box<Self>) -> Box<dyn Log>;
}
#[cfg(test)]
mod tests {
use std::fs::File;
use std::io::Read;
use super::*;
#[test]
fn test() {
let mut i = 0;
CombinedLogger::init({
let mut vec = Vec::new();
let mut conf_builder = ConfigBuilder::new();
for elem in vec![
LevelFilter::Off,
LevelFilter::Trace,
LevelFilter::Debug,
LevelFilter::Info,
LevelFilter::Warn,
LevelFilter::Error,
] {
let conf = conf_builder
.set_location_level(elem)
.set_target_level(elem)
.set_max_level(elem)
.set_time_level(elem)
.build();
i += 1;
vec.push(
SimpleLogger::new(LevelFilter::Error, conf.clone()) as Box<dyn SharedLogger>
);
vec.push(
TermLogger::new(LevelFilter::Error, conf.clone(), TerminalMode::Mixed).unwrap()
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
LevelFilter::Error,
conf.clone(),
File::create(&format!("error_{}.log", i)).unwrap(),
) as Box<dyn SharedLogger>);
vec.push(
SimpleLogger::new(LevelFilter::Warn, conf.clone()) as Box<dyn SharedLogger>
);
vec.push(
TermLogger::new(LevelFilter::Warn, conf.clone(), TerminalMode::Mixed).unwrap()
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
LevelFilter::Warn,
conf.clone(),
File::create(&format!("warn_{}.log", i)).unwrap(),
) as Box<dyn SharedLogger>);
vec.push(
SimpleLogger::new(LevelFilter::Info, conf.clone()) as Box<dyn SharedLogger>
);
vec.push(
TermLogger::new(LevelFilter::Info, conf.clone(), TerminalMode::Mixed).unwrap()
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
LevelFilter::Info,
conf.clone(),
File::create(&format!("info_{}.log", i)).unwrap(),
) as Box<dyn SharedLogger>);
vec.push(
SimpleLogger::new(LevelFilter::Debug, conf.clone()) as Box<dyn SharedLogger>
);
vec.push(
TermLogger::new(LevelFilter::Debug, conf.clone(), TerminalMode::Mixed).unwrap()
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
LevelFilter::Debug,
conf.clone(),
File::create(&format!("debug_{}.log", i)).unwrap(),
) as Box<dyn SharedLogger>);
vec.push(
SimpleLogger::new(LevelFilter::Trace, conf.clone()) as Box<dyn SharedLogger>
);
vec.push(
TermLogger::new(LevelFilter::Trace, conf.clone(), TerminalMode::Mixed).unwrap()
as Box<dyn SharedLogger>,
);
vec.push(WriteLogger::new(
LevelFilter::Trace,
conf.clone(),
File::create(&format!("trace_{}.log", i)).unwrap(),
) as Box<dyn SharedLogger>);
}
vec
})
.unwrap();
error!("Test Error");
warn!("Test Warning");
info!("Test Information");
debug!("Test Debug");
trace!("Test Trace");
for j in 1..i {
let mut error = String::new();
File::open(&format!("error_{}.log", j))
.unwrap()
.read_to_string(&mut error)
.unwrap();
let mut warn = String::new();
File::open(&format!("warn_{}.log", j))
.unwrap()
.read_to_string(&mut warn)
.unwrap();
let mut info = String::new();
File::open(&format!("info_{}.log", j))
.unwrap()
.read_to_string(&mut info)
.unwrap();
let mut debug = String::new();
File::open(&format!("debug_{}.log", j))
.unwrap()
.read_to_string(&mut debug)
.unwrap();
let mut trace = String::new();
File::open(&format!("trace_{}.log", j))
.unwrap()
.read_to_string(&mut trace)
.unwrap();
assert!(error.contains("Test Error"));
assert!(!error.contains("Test Warning"));
assert!(!error.contains("Test Information"));
assert!(!error.contains("Test Debug"));
assert!(!error.contains("Test Trace"));
assert!(warn.contains("Test Error"));
assert!(warn.contains("Test Warning"));
assert!(!warn.contains("Test Information"));
assert!(!warn.contains("Test Debug"));
assert!(!warn.contains("Test Trace"));
assert!(info.contains("Test Error"));
assert!(info.contains("Test Warning"));
assert!(info.contains("Test Information"));
assert!(!info.contains("Test Debug"));
assert!(!info.contains("Test Trace"));
assert!(debug.contains("Test Error"));
assert!(debug.contains("Test Warning"));
assert!(debug.contains("Test Information"));
assert!(debug.contains("Test Debug"));
assert!(!debug.contains("Test Trace"));
assert!(trace.contains("Test Error"));
assert!(trace.contains("Test Warning"));
assert!(trace.contains("Test Information"));
assert!(trace.contains("Test Debug"));
assert!(trace.contains("Test Trace"));
}
}
}