#![cfg(feature = "logging")]
use clap::crate_name;
struct StdLogger {
verbose: bool,
}
impl log::Log for StdLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
if !metadata.target().starts_with(crate_name!()) && !metadata.target().starts_with("rustls")
{
return false;
}
if self.verbose {
true } else {
metadata.level() <= log::Level::Debug }
}
fn flush(&self) {
}
fn log(&self, record: &log::Record) {
use log::Level;
if self.enabled(record.metadata()) {
let args = record.args();
if record.target().starts_with("rustls") {
let target = record.target();
if target == "rustls::common_state" {
return;
}
match target {
"rustls::client::tls12" | "rustls::client::tls13" => {
eprintln!("* [TLS] {args}")
}
"rustls::client::hs" => eprintln!("* [Handshake] {args}"),
"rustls::client::common" => eprintln!("* [Client] {args}"),
_ => eprintln!("* [{target}] {args}"),
}
return;
}
match record.level() {
Level::Trace | Level::Debug | Level::Warn | Level::Error => eprintln!("{args}"),
Level::Info => println!("{args}"),
}
}
}
}
static LOGGER: StdLogger = StdLogger { verbose: false };
static VERBOSE_LOGGER: StdLogger = StdLogger { verbose: true };
pub(crate) fn init(verbose: bool) {
let (logger, level) = if verbose {
(&LOGGER, log::LevelFilter::Trace)
} else {
(&VERBOSE_LOGGER, log::LevelFilter::Info)
};
log::set_logger(logger).unwrap_or_else(|err| panic!("failed to initialise the logger: {err}"));
log::set_max_level(level);
}