From a8f8f63e88471a400f112b2cf6731a8d9a55f9fc Mon Sep 17 00:00:00 2001 From: Robin Olsen Date: Mon, 2 Mar 2026 23:04:57 +0100 Subject: [PATCH] configure json logger --- internal/app/options.go | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/internal/app/options.go b/internal/app/options.go index 840c865..d288c28 100644 --- a/internal/app/options.go +++ b/internal/app/options.go @@ -2,8 +2,10 @@ package app import ( "context" + "io" "log/slog" "os" + "path/filepath" "github.com/LazyBachelor/LazyPM/internal/models" ) @@ -23,15 +25,43 @@ type AppBuilder struct { } func defaultBuilder(ctx context.Context, config Config) *AppBuilder { + lifecycle := NewLifecycle() + logger := newDefaultLogger(config, lifecycle) + return &AppBuilder{ ctx: ctx, config: config, - lifecycle: NewLifecycle(), + lifecycle: lifecycle, initializer: &InteractiveInitializer{}, - logger: slog.New(slog.NewJSONHandler(os.Stdout, nil)), + logger: logger, } } +func newDefaultLogger(config Config, lifecycle *Lifecycle) *slog.Logger { + statsDir := filepath.Dir(config.StatisticsStoragePath) + if statsDir == "" { + statsDir = "." + } + + if err := os.MkdirAll(statsDir, 0o755); err != nil { + return slog.New(slog.NewJSONHandler(io.Discard, nil)) + } + + logPath := filepath.Join(statsDir, "app-logs.jsonl") + logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) + if err != nil { + return slog.New(slog.NewJSONHandler(io.Discard, nil)) + } + + if lifecycle != nil { + lifecycle.Add(func() { + _ = logFile.Close() + }) + } + + return slog.New(slog.NewJSONHandler(logFile, &slog.HandlerOptions{})) +} + func WithLogger(logger *slog.Logger) Option { return func(b *AppBuilder) error { b.logger = logger