flexi_logger 0.22.3

An easy-to-configure and flexible logger that writes logs to stderr or stdout and/or to files. It allows custom logline formats, and it allows changing the log specification at runtime. It also allows defining additional log streams, e.g. for alert or security messages.
Documentation
use std::fmt;
use std::time::Instant;

struct Struct {
    data: [u8; 32],
}

impl fmt::Display for Struct {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{:?}", self.data)
    }
}

fn main() {
    // --------------------------------
    println!("flexi_logger");
    flexi_logger::Logger::try_with_str("off")
        .unwrap()
        .format(flexi_logger::detailed_format)
        .start()
        .unwrap();
    // --------------------------------
    // $> Set-Item -Path Env:RUST_LOG -Value "trace"
    // println!("env_logger");
    // env_logger::init();
    // $> Set-Item -Path Env:RUST_LOG
    // --------------------------------
    let mut structs = Vec::new();
    for i in 0..100 {
        structs.push(Struct {
            data: [i as u8; 32],
        });
    }

    {
        // With format
        let start = Instant::now();
        for s in &structs {
            log::info!("{}", format!("{}", s));
        }
        eprintln!("with format: {:?}", start.elapsed()); // 2-7ms
    }

    {
        // Plain logger
        let start = Instant::now();
        for s in &structs {
            log::info!("{}", s);
        }
        eprintln!("plain: {:?}", start.elapsed()); // 17-26ms
    }
}