From 7836eb4eaa4af6075e2d38deb44652aa55adcca6 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sat, 7 Mar 2026 11:31:12 -0500 Subject: [PATCH] Separate serve logs from CLI logs `arc serve` writes to `serve-YYYY-MM-DD.log` and all other commands write to `cli-YYYY-MM-DD.log` so the two are easy to tail independently. Co-Authored-By: Claude Opus 4.6 --- crates/arc-cli/src/logging.rs | 6 ++++-- crates/arc-cli/src/main.rs | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/arc-cli/src/logging.rs b/crates/arc-cli/src/logging.rs index 28cf23bdd..b0abdc305 100644 --- a/crates/arc-cli/src/logging.rs +++ b/crates/arc-cli/src/logging.rs @@ -1,7 +1,7 @@ use anyhow::{Context, Result}; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; -pub fn init_tracing(debug: bool) -> Result<()> { +pub fn init_tracing(debug: bool, log_prefix: &str) -> Result<()> { let default_level = if debug { "debug" } else { "info" }; let filter = EnvFilter::try_from_env("ARC_LOG").unwrap_or_else(|_| EnvFilter::new(default_level)); @@ -13,7 +13,9 @@ pub fn init_tracing(debug: bool) -> Result<()> { std::fs::create_dir_all(&log_dir) .with_context(|| format!("Failed to create log directory: {}", log_dir.display()))?; - let filename = chrono::Local::now().format("%Y-%m-%d.log").to_string(); + let filename = chrono::Local::now() + .format(&format!("{log_prefix}-%Y-%m-%d.log")) + .to_string(); let file_appender = tracing_appender::rolling::never(&log_dir, &filename); tracing_subscriber::registry() diff --git a/crates/arc-cli/src/main.rs b/crates/arc-cli/src/main.rs index 8bf06cc9b..4a0d971b4 100644 --- a/crates/arc-cli/src/main.rs +++ b/crates/arc-cli/src/main.rs @@ -125,10 +125,6 @@ async fn main() -> Result<()> { dotenvy::dotenv().ok(); } - if let Err(err) = logging::init_tracing(cli.debug) { - eprintln!("Warning: failed to initialize logging: {err:#}"); - } - let command_name = match &cli.command { Command::Llm { .. } => "llm", Command::Agent(_) => "agent", @@ -140,6 +136,12 @@ async fn main() -> Result<()> { Command::Doctor { .. } => "doctor", Command::Setup => "setup", }; + + let log_prefix = if command_name == "serve" { "serve" } else { "cli" }; + if let Err(err) = logging::init_tracing(cli.debug, log_prefix) { + eprintln!("Warning: failed to initialize logging: {err:#}"); + } + debug!(command = %command_name, "CLI command started"); match cli.command {