From 3ebf88fb3e119dc97c74517f476fe137e6609e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torjus=20H=C3=A5kestad?= Date: Sat, 14 Feb 2026 16:45:38 +0100 Subject: [PATCH] feat: add json log format option Add log_format config field ("text" default, "json" for structured JSON output) to support machine-readable logging. Co-Authored-By: Claude Opus 4.6 --- cmd/oubliette/main.go | 9 ++++++++- internal/config/config.go | 6 +++++- oubliette.toml.example | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/oubliette/main.go b/cmd/oubliette/main.go index be43975..e2f6c38 100644 --- a/cmd/oubliette/main.go +++ b/cmd/oubliette/main.go @@ -34,7 +34,14 @@ func main() { level.Set(slog.LevelInfo) } - logger := slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: level})) + var handler slog.Handler + opts := &slog.HandlerOptions{Level: level} + if cfg.LogFormat == "json" { + handler = slog.NewJSONHandler(os.Stderr, opts) + } else { + handler = slog.NewTextHandler(os.Stderr, opts) + } + logger := slog.New(handler) slog.SetDefault(logger) ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) diff --git a/internal/config/config.go b/internal/config/config.go index 4155b92..6b08979 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -11,7 +11,8 @@ import ( type Config struct { SSH SSHConfig `toml:"ssh"` Auth AuthConfig `toml:"auth"` - LogLevel string `toml:"log_level"` + LogLevel string `toml:"log_level"` + LogFormat string `toml:"log_format"` // "text" (default) or "json" } type SSHConfig struct { @@ -73,6 +74,9 @@ func applyDefaults(cfg *Config) { if cfg.LogLevel == "" { cfg.LogLevel = "info" } + if cfg.LogFormat == "" { + cfg.LogFormat = "text" + } } func validate(cfg *Config) error { diff --git a/oubliette.toml.example b/oubliette.toml.example index c976f3d..f834bf8 100644 --- a/oubliette.toml.example +++ b/oubliette.toml.example @@ -1,4 +1,5 @@ log_level = "info" +log_format = "text" # "text" or "json" [ssh] listen_addr = ":2222"