diff options
Diffstat (limited to 'crates/core/logger.rs')
-rw-r--r-- | crates/core/logger.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/crates/core/logger.rs b/crates/core/logger.rs new file mode 100644 index 00000000..f12f0b19 --- /dev/null +++ b/crates/core/logger.rs @@ -0,0 +1,68 @@ +// This module defines a super simple logger that works with the `log` crate. +// We don't need anything fancy; just basic log levels and the ability to +// print to stderr. We therefore avoid bringing in extra dependencies just +// for this functionality. + +use log::{self, Log}; + +/// The simplest possible logger that logs to stderr. +/// +/// This logger does no filtering. Instead, it relies on the `log` crates +/// filtering via its global max_level setting. +#[derive(Debug)] +pub struct Logger(()); + +const LOGGER: &'static Logger = &Logger(()); + +impl Logger { + /// Create a new logger that logs to stderr and initialize it as the + /// global logger. If there was a problem setting the logger, then an + /// error is returned. + pub fn init() -> Result<(), log::SetLoggerError> { + log::set_logger(LOGGER) + } +} + +impl Log for Logger { + fn enabled(&self, _: &log::Metadata) -> bool { + // We set the log level via log::set_max_level, so we don't need to + // implement filtering here. + true + } + + fn log(&self, record: &log::Record) { + match (record.file(), record.line()) { + (Some(file), Some(line)) => { + eprintln!( + "{}|{}|{}:{}: {}", + record.level(), + record.target(), + file, + line, + record.args() + ); + } + (Some(file), None) => { + eprintln!( + "{}|{}|{}: {}", + record.level(), + record.target(), + file, + record.args() + ); + } + _ => { + eprintln!( + "{}|{}: {}", + record.level(), + record.target(), + record.args() + ); + } + } + } + + fn flush(&self) { + // We use eprintln! which is flushed on every call. + } +} |