snarkos_cli/helpers/
logger.rsuse crate::helpers::{DynamicFormatter, LogWriter};
use crossterm::tty::IsTty;
use std::{
fs::File,
io,
path::Path,
sync::{Arc, atomic::AtomicBool},
};
use tokio::sync::mpsc;
use tracing_subscriber::{
EnvFilter,
layer::{Layer, SubscriberExt},
util::SubscriberInitExt,
};
pub fn initialize_logger<P: AsRef<Path>>(
verbosity: u8,
nodisplay: bool,
logfile: P,
shutdown: Arc<AtomicBool>,
) -> mpsc::Receiver<Vec<u8>> {
match verbosity {
0 => std::env::set_var("RUST_LOG", "info"),
1 => std::env::set_var("RUST_LOG", "debug"),
2.. => std::env::set_var("RUST_LOG", "trace"),
};
let [filter, filter2] = std::array::from_fn(|_| {
let filter = EnvFilter::from_default_env()
.add_directive("mio=off".parse().unwrap())
.add_directive("tokio_util=off".parse().unwrap())
.add_directive("hyper=off".parse().unwrap())
.add_directive("reqwest=off".parse().unwrap())
.add_directive("want=off".parse().unwrap())
.add_directive("warp=off".parse().unwrap());
let filter = if verbosity >= 2 {
filter.add_directive("snarkos_node_sync=trace".parse().unwrap())
} else {
filter.add_directive("snarkos_node_sync=debug".parse().unwrap())
};
let filter = if verbosity >= 3 {
filter
.add_directive("snarkos_node_bft=trace".parse().unwrap())
.add_directive("snarkos_node_bft::gateway=debug".parse().unwrap())
} else {
filter.add_directive("snarkos_node_bft=debug".parse().unwrap())
};
let filter = if verbosity >= 4 {
filter.add_directive("snarkos_node_bft::gateway=trace".parse().unwrap())
} else {
filter.add_directive("snarkos_node_bft::gateway=debug".parse().unwrap())
};
let filter = if verbosity >= 5 {
filter.add_directive("snarkos_node_router=trace".parse().unwrap())
} else {
filter.add_directive("snarkos_node_router=debug".parse().unwrap())
};
if verbosity >= 6 {
filter.add_directive("snarkos_node_tcp=trace".parse().unwrap())
} else {
filter.add_directive("snarkos_node_tcp=off".parse().unwrap())
}
});
let logfile_dir = logfile.as_ref().parent().expect("Root directory passed as a logfile");
if !logfile_dir.exists() {
std::fs::create_dir_all(logfile_dir)
.expect("Failed to create a directories: '{logfile_dir}', please check if user has permissions");
}
let logfile =
File::options().append(true).create(true).open(logfile).expect("Failed to open the file for writing logs");
let (log_sender, log_receiver) = mpsc::channel(1024);
let log_sender = match nodisplay {
true => None,
false => Some(log_sender),
};
let _ = tracing_subscriber::registry()
.with(
tracing_subscriber::fmt::Layer::default()
.with_ansi(log_sender.is_none() && io::stdout().is_tty())
.with_writer(move || LogWriter::new(&log_sender))
.with_target(verbosity > 2)
.event_format(DynamicFormatter::new(shutdown))
.with_filter(filter),
)
.with(
tracing_subscriber::fmt::Layer::default()
.with_ansi(false)
.with_writer(logfile)
.with_target(verbosity > 2)
.with_filter(filter2),
)
.try_init();
log_receiver
}
pub fn welcome_message() -> String {
use colored::Colorize;
let mut output = String::new();
output += &r#"
╦╬╬╬╬╬╦
╬╬╬╬╬╬╬╬╬ ▄▄▄▄ ▄▄▄
╬╬╬╬╬╬╬╬╬╬╬ ▐▓▓▓▓▌ ▓▓▓
╬╬╬╬╬╬╬╬╬╬╬╬╬ ▐▓▓▓▓▓▓▌ ▓▓▓ ▄▄▄▄▄▄ ▄▄▄▄▄▄
╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬ ▐▓▓▓ ▓▓▓▌ ▓▓▓ ▄▓▓▀▀▀▀▓▓▄ ▐▓▓▓▓▓▓▓▓▌
╬╬╬╬╬╬╬╜ ╙╬╬╬╬╬╬╬ ▐▓▓▓▌ ▐▓▓▓▌ ▓▓▓ ▐▓▓▓▄▄▄▄▓▓▓▌ ▐▓▓▓ ▓▓▓▌
╬╬╬╬╬╬╣ ╠╬╬╬╬╬╬ ▓▓▓▓▓▓▓▓▓▓▓▓ ▓▓▓ ▐▓▓▀▀▀▀▀▀▀▀▘ ▐▓▓▓ ▓▓▓▌
╬╬╬╬╬╬╣ ╠╬╬╬╬╬╬ ▓▓▓▓▌ ▐▓▓▓▓ ▓▓▓ ▀▓▓▄▄▄▄▓▓▀ ▐▓▓▓▓▓▓▓▓▌
╬╬╬╬╬╬╣ ╠╬╬╬╬╬╬ ▝▀▀▀▀ ▀▀▀▀▘ ▀▀▀ ▀▀▀▀▀▀ ▀▀▀▀▀▀
╚╬╬╬╬╬╩ ╩╬╬╬╬╩
"#
.white()
.bold();
output += &"👋 Welcome to Aleo! We thank you for running a node and supporting privacy.\n".bold();
output
}