From 96c3dbc7ca8d9eb872fd5c1f6299897e85b13e7c Mon Sep 17 00:00:00 2001 From: Ben Firshman Date: Wed, 4 Mar 2026 17:00:05 -0600 Subject: [PATCH 1/3] feat: use human-readable log format for local CLI commands Coglet defaults to JSON structured logs for production (GKE/Stackdriver compatibility), but this makes local development output hard to read. Set LOG_FORMAT=console in cog serve, cog run, cog predict, and cog train so developers see human-readable logs locally. Production is unaffected since the env var is only set by the CLI for local commands. --- pkg/cli/exec.go | 6 +++++- pkg/cli/serve.go | 6 +++++- pkg/predict/predictor.go | 3 +++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/cli/exec.go b/pkg/cli/exec.go index abe540a13c..706e8e4834 100644 --- a/pkg/cli/exec.go +++ b/pkg/cli/exec.go @@ -103,8 +103,12 @@ func execCmd(cmd *cobra.Command, args []string) error { gpus = "all" } + // Use human-readable log format for local development + env := make([]string, len(envFlags)) + copy(env, envFlags) + env = append(env, "LOG_FORMAT=console") + // Automatically propagate RUST_LOG for Rust coglet debugging - env := envFlags if rustLog := os.Getenv("RUST_LOG"); rustLog != "" { env = append(env, "RUST_LOG="+rustLog) } diff --git a/pkg/cli/serve.go b/pkg/cli/serve.go index 5ef1047c1c..a09c36e95e 100644 --- a/pkg/cli/serve.go +++ b/pkg/cli/serve.go @@ -109,8 +109,12 @@ func cmdServe(cmd *cobra.Command, arg []string) error { args = append(args, "--upload-url", uploadURL) } + // Use human-readable log format for local development + env := make([]string, len(envFlags)) + copy(env, envFlags) + env = append(env, "LOG_FORMAT=console") + // Automatically propagate RUST_LOG for Rust coglet debugging - env := envFlags if rustLog := os.Getenv("RUST_LOG"); rustLog != "" { env = append(env, "RUST_LOG="+rustLog) } diff --git a/pkg/predict/predictor.go b/pkg/predict/predictor.go index 2de3046603..f0e783a488 100644 --- a/pkg/predict/predictor.go +++ b/pkg/predict/predictor.go @@ -60,6 +60,9 @@ type Predictor struct { } func NewPredictor(ctx context.Context, runOptions command.RunOptions, isTrain bool, dockerCommand command.Command) (*Predictor, error) { + // Use human-readable log format for local development + runOptions.Env = append(runOptions.Env, "LOG_FORMAT=console") + if global.Debug { runOptions.Env = append(runOptions.Env, "COG_LOG_LEVEL=debug") } else { From ae5b9dc7ba46839edac385723dc585326d54a1a0 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Wed, 8 Apr 2026 16:18:47 -0400 Subject: [PATCH 2/3] Update pkg/predict/predictor.go Co-authored-by: ask-bonk[bot] <249159057+ask-bonk[bot]@users.noreply.github.com> Signed-off-by: Mark Phelps <209477+markphelps@users.noreply.github.com> --- pkg/predict/predictor.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/predict/predictor.go b/pkg/predict/predictor.go index f0e783a488..907bcffdfa 100644 --- a/pkg/predict/predictor.go +++ b/pkg/predict/predictor.go @@ -61,7 +61,10 @@ type Predictor struct { func NewPredictor(ctx context.Context, runOptions command.RunOptions, isTrain bool, dockerCommand command.Command) (*Predictor, error) { // Use human-readable log format for local development - runOptions.Env = append(runOptions.Env, "LOG_FORMAT=console") + // Use human-readable log format for local development + env := make([]string, len(runOptions.Env)) + copy(env, runOptions.Env) + runOptions.Env = append(env, "LOG_FORMAT=console") if global.Debug { runOptions.Env = append(runOptions.Env, "COG_LOG_LEVEL=debug") From 7f763990045848ef54242294a7c1045406092c3a Mon Sep 17 00:00:00 2001 From: Mark Phelps Date: Wed, 8 Apr 2026 16:33:58 -0400 Subject: [PATCH 3/3] chore: appease the linter Signed-off-by: Mark Phelps --- pkg/predict/predictor.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/predict/predictor.go b/pkg/predict/predictor.go index 907bcffdfa..8ea42f5507 100644 --- a/pkg/predict/predictor.go +++ b/pkg/predict/predictor.go @@ -60,18 +60,19 @@ type Predictor struct { } func NewPredictor(ctx context.Context, runOptions command.RunOptions, isTrain bool, dockerCommand command.Command) (*Predictor, error) { - // Use human-readable log format for local development // Use human-readable log format for local development env := make([]string, len(runOptions.Env)) copy(env, runOptions.Env) - runOptions.Env = append(env, "LOG_FORMAT=console") + env = append(env, "LOG_FORMAT=console") if global.Debug { - runOptions.Env = append(runOptions.Env, "COG_LOG_LEVEL=debug") + env = append(env, "COG_LOG_LEVEL=debug") } else { - runOptions.Env = append(runOptions.Env, "COG_LOG_LEVEL=warning") + env = append(env, "COG_LOG_LEVEL=warning") } + runOptions.Env = env + return &Predictor{ runOptions: runOptions, isTrain: isTrain,