= Rust/Logging = * Base crate is log to provide standard traits for different logging crates * log4rs allows for logging config file == Tracing == == log4rs == * {{{ cargo add log }}} * {{{ cargo add log4rs }}} * src/log4.rs {{{#rust use log::LevelFilter; use log4rs::append::console::{self}; use log4rs::config::{Appender, Config, Logger, Root}; use log4rs::encode::pattern::PatternEncoder; use std::sync::OnceLock; pub fn init_log() { static INIT: OnceLock<()> = OnceLock::new(); // initialise only once INIT.get_or_init(|| { let logfile = log4rs::append::file::FileAppender::builder() .build("my-log.log") .unwrap(); // {d}: Timestamp of the log entry. // {l}: Log level (e.g., INFO, DEBUG). // {m}: The actual log message. // {n}: Newline character. // {h}: highlight ?? let console = console::ConsoleAppender::builder() .encoder(Box::new(PatternEncoder::new( "{d} {h({l})} t{t}\n {h({m}{n})}", // Add custom formatting ))) .build(); let config = Config::builder() .appender(Appender::builder().build("logfile", Box::new(logfile))) .appender(Appender::builder().build("console", Box::new(console))) .logger( Logger::builder() .additive(false) .build("my_module", LevelFilter::Debug), // Set to Debug for detailed logs ) .build(Root::builder().appender("console").build(LevelFilter::Info)) .unwrap(); log4rs::init_config(config).unwrap(); }); } }}} ---- CategoryLogging