use logging::{Formatter, Level, Logger, Record, StreamHandler};
fn colorize(record: &Record, line: &String) -> String {
let code = match record.get("level").copied() {
Some("DEBUG") => "90", Some("INFO") => "34", Some("WARNING") => "33", Some("ERROR") => "31", Some("CRITICAL") => "38;5;88", _ => return line.clone(), };
format!("\x1b[{code}m{line}\x1b[0m")
}
fn main() {
let mut formatter = Formatter::new("%(timestamp) [%(level)-8] %(name)-12 | %(message)");
formatter.set_time_format("%Y-%m-%d %H:%M:%S");
formatter.set_transformer(colorize);
let root = Logger::root();
root.add_handler(StreamHandler::new(formatter, std::io::stdout()))
.expect("root handler lock should not be poisoned at startup");
root.set_level(Level::Debug);
let logger = Logger::get("quickstart");
logger.debug("a debug message (gray)");
logger.info("an info message (blue)");
logger.warning("a warning message (yellow)");
logger.error("an error message (red)");
logger.critical("a critical message (deep red)");
logger.set_level(Level::Warning);
logger.debug("you will NOT see this (below threshold)");
logger.info("you will NOT see this either");
logger.warning("but warnings still get through");
}