From 1ddc22d34956f4d60ace902494b4accfe3352df3 Mon Sep 17 00:00:00 2001 From: Cam Walter Date: Sat, 4 May 2024 00:44:17 -0500 Subject: [PATCH 1/2] new: Add colored log levels --- Cargo.lock | 1 + Cargo.toml | 1 + src/logging.rs | 34 ++++++++++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 237a89213f..374e6dbe57 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -541,6 +541,7 @@ dependencies = [ "aarch64", "ahash", "align-address", + "anstyle", "anyhow", "arm-gic", "async-lock", diff --git a/Cargo.toml b/Cargo.toml index baa53654ef..7867767550 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -102,6 +102,7 @@ async-trait = "0.1.80" async-lock = { version = "3.3.0", default-features = false } simple-shell = { version = "0.0.1", optional = true } volatile = "0.5.4" +anstyle = { version = "1", default-features = false } [dependencies.smoltcp] version = "0.11" diff --git a/src/logging.rs b/src/logging.rs index 905268a9ba..a39d309559 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -1,4 +1,7 @@ -use log::{LevelFilter, Metadata, Record}; +use core::fmt; + +use anstyle::AnsiColor; +use log::{Level, LevelFilter, Metadata, Record}; /// Data structure to filter kernel messages struct KernelLogger; @@ -17,13 +20,40 @@ impl log::Log for KernelLogger { println!( "[{}][{}] {}", crate::arch::core_local::core_id(), - record.level(), + ColorLevel(record.level()), record.args() ); } } } +struct ColorLevel(Level); + +impl fmt::Display for ColorLevel { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let level = self.0; + + if no_color() { + write!(f, "{level}") + } else { + let color = match level { + Level::Trace => AnsiColor::Magenta, + Level::Debug => AnsiColor::Yellow, + Level::Info => AnsiColor::Green, + Level::Warn => AnsiColor::Blue, + Level::Error => AnsiColor::Red, + }; + + let style = anstyle::Style::new().fg_color(Some(color.into())); + write!(f, "{style}{level}{style:#}") + } + } +} + +fn no_color() -> bool { + option_env!("NO_COLOR").is_some_and(|val| !val.is_empty()) +} + pub unsafe fn init() { log::set_logger(&KernelLogger).expect("Can't initialize logger"); // Determines LevelFilter at compile time From 7797897fa8e0106b5339f177ebd96b14dfa6072e Mon Sep 17 00:00:00 2001 From: Cam Walter Date: Sat, 4 May 2024 17:31:14 -0500 Subject: [PATCH 2/2] fix debug and warn log level colors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Martin Kröning --- src/logging.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/logging.rs b/src/logging.rs index a39d309559..e47d053e06 100644 --- a/src/logging.rs +++ b/src/logging.rs @@ -38,9 +38,9 @@ impl fmt::Display for ColorLevel { } else { let color = match level { Level::Trace => AnsiColor::Magenta, - Level::Debug => AnsiColor::Yellow, + Level::Debug => AnsiColor::Blue, Level::Info => AnsiColor::Green, - Level::Warn => AnsiColor::Blue, + Level::Warn => AnsiColor::Yellow, Level::Error => AnsiColor::Red, };