adding color to logs
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2025-05-11 13:44:06 +02:00
parent a8e09718d4
commit d475c59856
3 changed files with 203 additions and 60 deletions

View File

@ -1,6 +1,7 @@
use chrono::Local;
use env_logger::Builder;
use log::kv::{Error, Key, Value, VisitSource};
use owo_colors::OwoColorize;
use std::io::Write;
/// Struct for visiting key-value pairs and formatting them as logfmt.
@ -20,6 +21,7 @@ pub struct LoggerBuilder {
skip_messages: Vec<String>,
include_date: bool,
include_target: bool,
use_color: bool,
}
impl LoggerBuilder {
@ -29,6 +31,7 @@ impl LoggerBuilder {
skip_messages: vec![],
include_date: true,
include_target: true,
use_color: true,
}
}
@ -50,6 +53,12 @@ impl LoggerBuilder {
self
}
/// Enables or disables the use of color in logs.
pub fn use_color(mut self, use_color: bool) -> Self {
self.use_color = use_color;
self
}
/// Formats a log record into a string based on the configuration.
fn format_log(&self, record: &log::Record) -> Option<String> {
let msg = record.args().to_string();
@ -67,11 +76,18 @@ impl LoggerBuilder {
));
}
log.push_str(&format!(
"level=\"{}\" msg=\"{}\"",
record.level().as_str().to_lowercase(),
msg
));
let level_str = if self.use_color {
match record.level() {
log::Level::Error => "error".red().to_string(),
log::Level::Warn => "warn".yellow().to_string(),
log::Level::Info => "info".green().to_string(),
log::Level::Debug => "debug".blue().to_string(),
log::Level::Trace => "trace".cyan().to_string(),
}
} else {
record.level().as_str().to_lowercase()
};
log.push_str(&format!("level=\"{}\" msg=\"{}\"", level_str, msg));
let _ = record
.key_values()
@ -112,7 +128,10 @@ mod tests {
#[test]
fn test_format_log_with_date_and_target() {
let builder = LoggerBuilder::new().include_date(true).include_target(true);
let builder = LoggerBuilder::new()
.include_date(true)
.include_target(true)
.use_color(false);
let record = Record::builder()
.args(format_args!("Test message"))
@ -133,7 +152,8 @@ mod tests {
fn test_format_log_without_date_and_target() {
let builder = LoggerBuilder::new()
.include_date(false)
.include_target(false);
.include_target(false)
.use_color(false);
let record = Record::builder()
.args(format_args!("Another test message"))