From 9cd839f890589185fe02ce13a3558c7d3bec4526 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 5 Feb 2026 17:55:34 -0800 Subject: [PATCH] fix: default logging to stdout with configurable target --- docs/cli.mdx | 3 ++- research/opencode-tmux-test.md | 5 +++-- server/packages/sandbox-agent/src/main.rs | 23 +++++++++++++++++++---- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/cli.mdx b/docs/cli.mdx index 6466cc7..d5cf6f7 100644 --- a/docs/cli.mdx +++ b/docs/cli.mdx @@ -24,12 +24,13 @@ sandbox-agent server [OPTIONS] | `-A, --cors-allow-header
` | all | CORS allowed header (repeatable) | | `-C, --cors-allow-credentials` | - | Enable CORS credentials | | `--no-telemetry` | - | Disable anonymous telemetry | +| `--log-to-file` | - | Redirect server logs to a daily log file | ```bash sandbox-agent server --token "$TOKEN" --port 3000 ``` -Server logs are redirected to a daily log file under the sandbox-agent data directory (for example, `~/.local/share/sandbox-agent/logs`). Override with `SANDBOX_AGENT_LOG_DIR`, or set `SANDBOX_AGENT_LOG_STDOUT=1` to keep logs on stdout/stderr. +Server logs print to stdout/stderr by default. Use `--log-to-file` or `SANDBOX_AGENT_LOG_TO_FILE=1` to redirect logs to a daily log file under the sandbox-agent data directory (for example, `~/.local/share/sandbox-agent/logs`). Override the directory with `SANDBOX_AGENT_LOG_DIR`, or set `SANDBOX_AGENT_LOG_STDOUT=1` to force stdout/stderr. HTTP request logging is enabled by default. Control it with: - `SANDBOX_AGENT_LOG_HTTP=0` to disable request logs diff --git a/research/opencode-tmux-test.md b/research/opencode-tmux-test.md index ff553c0..96cc3ab 100644 --- a/research/opencode-tmux-test.md +++ b/research/opencode-tmux-test.md @@ -9,7 +9,8 @@ This plan captures OpenCode TUI output and sends input via tmux so we can valida ## Environment - `SANDBOX_AGENT_LOG_DIR=/path` to set server log dir -- `SANDBOX_AGENT_LOG_STDOUT=1` to keep logs on stdout/stderr +- `SANDBOX_AGENT_LOG_TO_FILE=1` to redirect logs to files +- `SANDBOX_AGENT_LOG_STDOUT=1` to force logs on stdout/stderr - `SANDBOX_AGENT_LOG_HTTP=0` to disable request logs - `SANDBOX_AGENT_LOG_HTTP_HEADERS=1` to include request headers (Authorization redacted) - `RUST_LOG=...` for trace filtering @@ -42,7 +43,7 @@ This plan captures OpenCode TUI output and sends input via tmux so we can valida ```bash tmux capture-pane -pt opencode:0.0 -S -200 > /tmp/opencode-screen.txt ``` -6. Inspect server logs for requests: +6. Inspect server logs for requests (when log-to-file is enabled): ```bash tail -n 200 ~/.local/share/sandbox-agent/logs/log-$(date +%m-%d-%y) ``` diff --git a/server/packages/sandbox-agent/src/main.rs b/server/packages/sandbox-agent/src/main.rs index 46a9efe..0a2b72e 100644 --- a/server/packages/sandbox-agent/src/main.rs +++ b/server/packages/sandbox-agent/src/main.rs @@ -92,6 +92,9 @@ struct ServerArgs { #[arg(long = "no-telemetry")] no_telemetry: bool, + + #[arg(long = "log-to-file")] + log_to_file: bool, } #[derive(Args, Debug)] @@ -388,8 +391,8 @@ fn main() { } fn init_logging(cli: &Cli) -> Result<(), CliError> { - if matches!(cli.command, Command::Server(_)) { - maybe_redirect_server_logs(); + if let Command::Server(server) = &cli.command { + maybe_redirect_server_logs(server); } let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); @@ -472,8 +475,20 @@ fn default_server_log_dir() -> PathBuf { .unwrap_or_else(|| PathBuf::from(".").join(".sandbox-agent").join("logs")) } -fn maybe_redirect_server_logs() { - if std::env::var("SANDBOX_AGENT_LOG_STDOUT").is_ok() { +fn maybe_redirect_server_logs(server: &ServerArgs) { + let force_stdout = match std::env::var("SANDBOX_AGENT_LOG_STDOUT") { + Ok(value) if value == "0" || value.eq_ignore_ascii_case("false") => false, + Ok(_) => true, + Err(_) => false, + }; + let log_to_file_env = match std::env::var("SANDBOX_AGENT_LOG_TO_FILE") { + Ok(value) if value == "0" || value.eq_ignore_ascii_case("false") => false, + Ok(_) => true, + Err(_) => false, + }; + let log_to_file = server.log_to_file || log_to_file_env; + + if force_stdout || !log_to_file { return; }