Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/cortex-cli/src/logs_cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,27 @@ impl LogsCli {
println!("Following log file: {}", log_file.display());
println!("Press Ctrl+C to stop.\n");

let content = std::fs::read_to_string(log_file)?;
let lines: Vec<&str> = content.lines().collect();
let filtered_lines: Vec<&str> = if let Some(ref level) = self.level {
let level_upper = level.to_uppercase();
lines
.iter()
.filter(|line| line.to_uppercase().contains(&level_upper))
.copied()
.collect()
} else {
lines
};
let start = if filtered_lines.len() > self.lines {
filtered_lines.len() - self.lines
} else {
0
};
for line in &filtered_lines[start..] {
println!("{}", line);
}

let file = std::fs::File::open(log_file)?;
let mut reader = BufReader::new(file);

Expand Down
43 changes: 43 additions & 0 deletions src/cortex-cli/tests/logs_follow_lines.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
use std::fs;
use std::io::Read;
use std::process::{Command, Stdio};
use std::thread;
use std::time::Duration;

use tempfile::tempdir;

#[test]
fn logs_follow_prints_requested_initial_lines() {
let home = tempdir().unwrap();
let cache = tempdir().unwrap();
let logs_dir = cache.path().join("cortex").join("logs");
fs::create_dir_all(&logs_dir).unwrap();
fs::write(logs_dir.join("cortex.log"), "one\ntwo\nthree\nfour\n").unwrap();

let mut child = Command::new(env!("CARGO_BIN_EXE_Cortex"))
.args(["logs", "--follow", "--lines", "2"])
.env("HOME", home.path())
.env("XDG_CACHE_HOME", cache.path())
.env_remove("CORTEX_HOME")
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()
.unwrap();

thread::sleep(Duration::from_millis(250));
let _ = child.kill();

let mut stdout = String::new();
child
.stdout
.take()
.unwrap()
.read_to_string(&mut stdout)
.unwrap();
let _ = child.wait();

assert!(!stdout.contains("\none\n"), "output:\n{stdout}");
assert!(!stdout.contains("\ntwo\n"), "output:\n{stdout}");
assert!(stdout.contains("\nthree\n"), "output:\n{stdout}");
assert!(stdout.contains("\nfour\n"), "output:\n{stdout}");
}