feat(config): уровень логирования log.level (info|debug), по умолчанию info
Отладочные логи API-вызовов к opencode serve теперь включаются только при
log.level=debug (гейт через Client.Debug <- Runner.Debug <- cfg.Log.Debug()).
По умолчанию 'info' — отладочных логов нет.
- config: добавлен LogCfg{Level}, дефолт 'info', валидация (info|debug)
- opencode: Client.Debug и Runner.Debug — гейттят логи do()
- app: Runner.Debug из cfg.Log.Debug()
- config.yaml.example: задокументирован log.level
- тесты: дефолт=info, level=debug, невалидный уровень
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
@@ -90,6 +91,61 @@ telegram:
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoad_LogLevelDefault(t *testing.T) {
|
||||
t.Setenv("TG_TOKEN", "tok")
|
||||
t.Setenv("TG_CHAT_ID", "42")
|
||||
|
||||
yaml := `telegram:
|
||||
token: "${TG_TOKEN}"
|
||||
chat_id: "${TG_CHAT_ID}"
|
||||
`
|
||||
cfg, err := Load(writeCfg(t, yaml))
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if cfg.Log.Level != "info" {
|
||||
t.Errorf("log.level = %q, want info (дефолт)", cfg.Log.Level)
|
||||
}
|
||||
if cfg.Log.Debug() {
|
||||
t.Errorf("Debug() = true при уровне info, want false")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoad_LogLevelDebug(t *testing.T) {
|
||||
t.Setenv("TG_TOKEN", "tok")
|
||||
t.Setenv("TG_CHAT_ID", "42")
|
||||
|
||||
yaml := `telegram:
|
||||
token: "${TG_TOKEN}"
|
||||
chat_id: "${TG_CHAT_ID}"
|
||||
log:
|
||||
level: debug
|
||||
`
|
||||
cfg, err := Load(writeCfg(t, yaml))
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if !cfg.Log.Debug() {
|
||||
t.Errorf("Debug() = false при level=debug, want true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoad_LogLevelInvalid(t *testing.T) {
|
||||
t.Setenv("TG_TOKEN", "tok")
|
||||
t.Setenv("TG_CHAT_ID", "42")
|
||||
|
||||
yaml := `telegram:
|
||||
token: "${TG_TOKEN}"
|
||||
chat_id: "${TG_CHAT_ID}"
|
||||
log:
|
||||
level: warn
|
||||
`
|
||||
_, err := Load(writeCfg(t, yaml))
|
||||
if !errors.Is(err, ErrInvalidFormat) {
|
||||
t.Fatalf("Load: err = %v, want ErrInvalidFormat", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoad_OpenCodeConfigDir(t *testing.T) {
|
||||
t.Setenv("TG_TOKEN", "tok")
|
||||
t.Setenv("TG_CHAT_ID", "42")
|
||||
|
||||
@@ -10,6 +10,7 @@ package config
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -40,8 +41,18 @@ type Config struct {
|
||||
Chat ChatCfg `yaml:"chat"`
|
||||
Paths PathsCfg `yaml:"paths"`
|
||||
Update UpdateCfg `yaml:"update"`
|
||||
Log LogCfg `yaml:"log"`
|
||||
}
|
||||
|
||||
// LogCfg — уровень логирования. Level: "info" (по умолчанию) или "debug".
|
||||
// debug включает отладочные логи (напр. все API-вызовы к opencode serve).
|
||||
type LogCfg struct {
|
||||
Level string `yaml:"level" default:"info"`
|
||||
}
|
||||
|
||||
// Debug возвращает true, если включён отладочный уровень логирования.
|
||||
func (l LogCfg) Debug() bool { return strings.EqualFold(l.Level, "debug") }
|
||||
|
||||
// GitCfg — источник репозиториев (для git clone).
|
||||
type GitCfg struct {
|
||||
BaseURL string `yaml:"base_url" env:"GIT_BASE_URL"`
|
||||
@@ -116,5 +127,8 @@ func (c *Config) Validate() error {
|
||||
if c.Telegram.ChatID == "" {
|
||||
errs = append(errs, fmt.Errorf("%w: telegram.chat_id", ErrMissingField))
|
||||
}
|
||||
if !c.Log.Debug() && !strings.EqualFold(c.Log.Level, "info") {
|
||||
errs = append(errs, fmt.Errorf("%w: log.level (ожидается \"info\" или \"debug\")", ErrInvalidFormat))
|
||||
}
|
||||
return errors.Join(errs...)
|
||||
}
|
||||
Reference in New Issue
Block a user