From c865206542e195ea193b05b9d48846122459383d Mon Sep 17 00:00:00 2001 From: redpanda-f Date: Mon, 9 Mar 2026 09:01:28 +0000 Subject: [PATCH 1/3] feat: add curio debug level logging and capture stderr in container logs --- src/commands/start/curio/daemon.rs | 3 +++ src/commands/start/curio/db_setup.rs | 6 ++++++ src/constants.rs | 3 +++ src/docker/core.rs | 15 ++++++++++++--- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/commands/start/curio/daemon.rs b/src/commands/start/curio/daemon.rs index 1250ba3e..7a7d80bf 100644 --- a/src/commands/start/curio/daemon.rs +++ b/src/commands/start/curio/daemon.rs @@ -248,5 +248,8 @@ fn build_docker_create_args( docker_args.extend_from_slice(&["-e".to_string(), env.clone()]); } + docker_args.push("-e".to_string()); + docker_args.push(crate::constants::CURIO_LOG_LEVEL.to_string()); + Ok(docker_args) } diff --git a/src/commands/start/curio/db_setup.rs b/src/commands/start/curio/db_setup.rs index b89fc501..abd1bbb2 100644 --- a/src/commands/start/curio/db_setup.rs +++ b/src/commands/start/curio/db_setup.rs @@ -201,6 +201,9 @@ fn create_base_cluster( docker_args.push(env); } + docker_args.push("-e"); + docker_args.push(crate::constants::CURIO_LOG_LEVEL); + // Add image and command let bash_cmd = format!( "sleep 3 && /usr/local/bin/lotus-bins/curio config new-cluster {}", @@ -311,6 +314,9 @@ fn create_pdp_layer(context: &SetupContext, sp_index: usize) -> Result<(), Box Result> { /// Get logs from a Docker container. /// +/// Collects both stdout and stderr. Go programs (e.g. Curio) +/// write all log output to stderr, so both streams must be collected to get complete +/// logs. +/// /// # Arguments /// * `container_name` - The name of the container to get logs from /// /// # Returns -/// The container logs on success. +/// The combined stdout + stderr container logs on success. pub fn get_container_logs(container_name: &str) -> Result> { - let output = docker_command(&["logs", container_name])?; - Ok(String::from_utf8_lossy(&output.stdout).to_string()) + let output = Command::new("docker") + .args(["logs", container_name]) + .output()?; + let mut logs = String::new(); + logs.push_str(&String::from_utf8_lossy(&output.stdout)); + logs.push_str(&String::from_utf8_lossy(&output.stderr)); + Ok(logs) } /// Check if a port is available (not in use) From f3ebac74a298abefce80190363bd19611023c5ec Mon Sep 17 00:00:00 2001 From: RedPanda Date: Mon, 9 Mar 2026 17:36:18 +0530 Subject: [PATCH 2/3] Update src/docker/core.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/docker/core.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/docker/core.rs b/src/docker/core.rs index 64e48bdd..e5bd3971 100644 --- a/src/docker/core.rs +++ b/src/docker/core.rs @@ -64,9 +64,8 @@ pub fn docker_command(args: &[&str]) -> Result> { /// # Returns /// The combined stdout + stderr container logs on success. pub fn get_container_logs(container_name: &str) -> Result> { - let output = Command::new("docker") - .args(["logs", container_name]) - .output()?; + let output = docker_command(&["logs", container_name])?; + let mut logs = String::new(); logs.push_str(&String::from_utf8_lossy(&output.stdout)); logs.push_str(&String::from_utf8_lossy(&output.stderr)); From 4ecb510af3c7625f279b80e675db66158eeefd61 Mon Sep 17 00:00:00 2001 From: RedPanda Date: Mon, 9 Mar 2026 17:38:06 +0530 Subject: [PATCH 3/3] Update src/docker/core.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/docker/core.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/docker/core.rs b/src/docker/core.rs index e5bd3971..a457b310 100644 --- a/src/docker/core.rs +++ b/src/docker/core.rs @@ -67,8 +67,17 @@ pub fn get_container_logs(container_name: &str) -> Result let output = docker_command(&["logs", container_name])?; let mut logs = String::new(); - logs.push_str(&String::from_utf8_lossy(&output.stdout)); - logs.push_str(&String::from_utf8_lossy(&output.stderr)); + let stdout_str = String::from_utf8_lossy(&output.stdout); + let stderr_str = String::from_utf8_lossy(&output.stderr); + logs.push_str(&stdout_str); + if !stdout_str.is_empty() + && !stderr_str.is_empty() + && !stdout_str.ends_with('\n') + && !stderr_str.starts_with('\n') + { + logs.push('\n'); + } + logs.push_str(&stderr_str); Ok(logs) }