chore(config): move loglevel settings under gateway (#1912)

* Move log level config to gateway property

* Fix unit test

* Fix linting

* Fix linting

* Add comment for log level
This commit is contained in:
Kunal Karmakar 2026-03-23 10:44:53 +05:30 committed by GitHub
parent 75270c4777
commit 40279c8dde
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 17 additions and 16 deletions

View file

@ -32,7 +32,7 @@ func LoadConfig() (*config.Config, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
logger.SetLevelFromString(cfg.Agents.Defaults.LogLevel) logger.SetLevelFromString(cfg.Gateway.LogLevel)
return cfg, nil return cfg, nil
} }

View file

@ -1,7 +1,6 @@
{ {
"agents": { "agents": {
"defaults": { "defaults": {
"log_level": "fatal",
"workspace": "~/.picoclaw/workspace", "workspace": "~/.picoclaw/workspace",
"restrict_to_workspace": true, "restrict_to_workspace": true,
"model_name": "gpt-5.4", "model_name": "gpt-5.4",
@ -560,8 +559,10 @@
} }
}, },
"gateway": { "gateway": {
"_comment": "Default log level is set to 'fatal'. Other available options are 'debug', 'info', 'warn' and 'error'.",
"host": "127.0.0.1", "host": "127.0.0.1",
"port": 18790, "port": 18790,
"hot_reload": false "hot_reload": false,
"log_level": "fatal"
} }
} }

View file

@ -285,7 +285,6 @@ type AgentDefaults struct {
SteeringMode string `json:"steering_mode,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_STEERING_MODE"` // "one-at-a-time" (default) or "all" SteeringMode string `json:"steering_mode,omitempty" env:"PICOCLAW_AGENTS_DEFAULTS_STEERING_MODE"` // "one-at-a-time" (default) or "all"
SubTurn SubTurnConfig `json:"subturn" envPrefix:"PICOCLAW_AGENTS_DEFAULTS_SUBTURN_"` SubTurn SubTurnConfig `json:"subturn" envPrefix:"PICOCLAW_AGENTS_DEFAULTS_SUBTURN_"`
ToolFeedback ToolFeedbackConfig `json:"tool_feedback,omitempty"` ToolFeedback ToolFeedbackConfig `json:"tool_feedback,omitempty"`
LogLevel string `json:"log_level,omitempty" env:"PICOCLAW_LOG_LEVEL"`
} }
const ( const (
@ -736,6 +735,7 @@ type GatewayConfig struct {
Host string `json:"host" env:"PICOCLAW_GATEWAY_HOST"` Host string `json:"host" env:"PICOCLAW_GATEWAY_HOST"`
Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"` Port int `json:"port" env:"PICOCLAW_GATEWAY_PORT"`
HotReload bool `json:"hot_reload" env:"PICOCLAW_GATEWAY_HOT_RELOAD"` HotReload bool `json:"hot_reload" env:"PICOCLAW_GATEWAY_HOT_RELOAD"`
LogLevel string `json:"log_level,omitempty" env:"PICOCLAW_LOG_LEVEL"`
} }
type ToolDiscoveryConfig struct { type ToolDiscoveryConfig struct {

View file

@ -488,8 +488,8 @@ func TestDefaultConfig_HooksDefaults(t *testing.T) {
func TestDefaultConfig_LogLevel(t *testing.T) { func TestDefaultConfig_LogLevel(t *testing.T) {
cfg := DefaultConfig() cfg := DefaultConfig()
if cfg.Agents.Defaults.LogLevel != "fatal" { if cfg.Gateway.LogLevel != "fatal" {
t.Errorf("LogLevel = %q, want \"fatal\"", cfg.Agents.Defaults.LogLevel) t.Errorf("LogLevel = %q, want \"fatal\"", cfg.Gateway.LogLevel)
} }
} }
@ -1166,7 +1166,7 @@ func TestLoadConfig_UsesPassphraseProvider(t *testing.T) {
func TestConfigParsesLogLevel(t *testing.T) { func TestConfigParsesLogLevel(t *testing.T) {
dir := t.TempDir() dir := t.TempDir()
cfgPath := filepath.Join(dir, "config.json") cfgPath := filepath.Join(dir, "config.json")
data := `{"agents":{"defaults":{"log_level":"debug"}}}` data := `{"gateway":{"log_level":"debug"}}`
if err := os.WriteFile(cfgPath, []byte(data), 0o600); err != nil { if err := os.WriteFile(cfgPath, []byte(data), 0o600); err != nil {
t.Fatalf("setup: %v", err) t.Fatalf("setup: %v", err)
} }
@ -1175,8 +1175,8 @@ func TestConfigParsesLogLevel(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("LoadConfig: %v", err) t.Fatalf("LoadConfig: %v", err)
} }
if cfg.Agents.Defaults.LogLevel != "debug" { if cfg.Gateway.LogLevel != "debug" {
t.Errorf("LogLevel = %q, want \"debug\"", cfg.Agents.Defaults.LogLevel) t.Errorf("LogLevel = %q, want \"debug\"", cfg.Gateway.LogLevel)
} }
} }
@ -1193,7 +1193,7 @@ func TestConfigLogLevelEmpty(t *testing.T) {
t.Fatalf("LoadConfig: %v", err) t.Fatalf("LoadConfig: %v", err)
} }
// When config omits log_level, the DefaultConfig value ("fatal") is preserved. // When config omits log_level, the DefaultConfig value ("fatal") is preserved.
if cfg.Agents.Defaults.LogLevel != "fatal" { if cfg.Gateway.LogLevel != "fatal" {
t.Errorf("LogLevel = %q, want \"fatal\"", cfg.Agents.Defaults.LogLevel) t.Errorf("LogLevel = %q, want \"fatal\"", cfg.Gateway.LogLevel)
} }
} }

View file

@ -26,7 +26,6 @@ func DefaultConfig() *Config {
return &Config{ return &Config{
Agents: AgentsConfig{ Agents: AgentsConfig{
Defaults: AgentDefaults{ Defaults: AgentDefaults{
LogLevel: "fatal",
Workspace: workspacePath, Workspace: workspacePath,
RestrictToWorkspace: true, RestrictToWorkspace: true,
Provider: "", Provider: "",
@ -424,6 +423,7 @@ func DefaultConfig() *Config {
Host: "127.0.0.1", Host: "127.0.0.1",
Port: 18790, Port: 18790,
HotReload: false, HotReload: false,
LogLevel: "fatal",
}, },
Tools: ToolsConfig{ Tools: ToolsConfig{
MediaCleanup: MediaCleanupConfig{ MediaCleanup: MediaCleanupConfig{

View file

@ -85,7 +85,7 @@ func Run(debug bool, configPath string, allowEmptyStartup bool) error {
return fmt.Errorf("error loading config: %w", err) return fmt.Errorf("error loading config: %w", err)
} }
logger.SetLevelFromString(cfg.Agents.Defaults.LogLevel) logger.SetLevelFromString(cfg.Gateway.LogLevel)
if debug { if debug {
logger.SetLevel(logger.DEBUG) logger.SetLevel(logger.DEBUG)