diff --git a/src/cortex-cli/src/logs_cmd.rs b/src/cortex-cli/src/logs_cmd.rs index f525efc3..1b91414a 100644 --- a/src/cortex-cli/src/logs_cmd.rs +++ b/src/cortex-cli/src/logs_cmd.rs @@ -81,6 +81,16 @@ fn format_size(bytes: u64) -> String { } } +fn matches_level_filter(path: &PathBuf, level: Option<&str>) -> bool { + let Some(level) = level else { + return true; + }; + let level = level.to_uppercase(); + path.file_name() + .and_then(|n| n.to_str()) + .is_some_and(|name| name.to_uppercase().contains(&level)) +} + impl LogsCli { /// Run the logs command. pub async fn run(self) -> Result<()> { @@ -329,6 +339,7 @@ impl LogsCli { for entry in entries.flatten() { let path = entry.path(); if path.is_file() + && matches_level_filter(&path, self.level.as_deref()) && let Ok(meta) = entry.metadata() && let Ok(modified) = meta.modified() && modified < cutoff_time diff --git a/src/cortex-cli/tests/logs_clear_level.rs b/src/cortex-cli/tests/logs_clear_level.rs new file mode 100644 index 00000000..9b347e53 --- /dev/null +++ b/src/cortex-cli/tests/logs_clear_level.rs @@ -0,0 +1,46 @@ +use std::fs; +use std::process::Command; + +use tempfile::tempdir; + +fn combined_output(output: &std::process::Output) -> String { + format!( + "{}{}", + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ) +} + +#[test] +fn logs_clear_level_removes_only_matching_level_files() { + let home = tempdir().unwrap(); + let cache = tempdir().unwrap(); + let logs_dir = cache.path().join("cortex").join("logs"); + fs::create_dir_all(&logs_dir).unwrap(); + + let error_log = logs_dir.join("error.log"); + let debug_log = logs_dir.join("debug.log"); + let info_log = logs_dir.join("info.txt"); + + fs::write(&error_log, "error\n").unwrap(); + fs::write(&debug_log, "debug\n").unwrap(); + fs::write(&info_log, "info\n").unwrap(); + + let output = Command::new(env!("CARGO_BIN_EXE_Cortex")) + .args(["logs", "--clear", "--level", "error", "--keep-days", "0"]) + .env("HOME", home.path()) + .env("XDG_CACHE_HOME", cache.path()) + .env_remove("CORTEX_HOME") + .output() + .unwrap(); + + assert!( + output.status.success(), + "logs --clear --level failed:\n{}", + combined_output(&output) + ); + + assert!(!error_log.exists(), "expected error log to be cleared"); + assert!(debug_log.exists(), "expected debug log to remain"); + assert!(info_log.exists(), "expected info log to remain"); +}