From deef4a891bd021c3004b62ca2ea86226977197d3 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 12 Jul 2025 13:25:42 +0300 Subject: [PATCH] logs --- core/logs/color.go | 3 ++ core/logs/logger.go | 87 ++++++++++++++++++++++++++++++++++++--------- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/core/logs/color.go b/core/logs/color.go index 9e85e37..1c5a4fd 100644 --- a/core/logs/color.go +++ b/core/logs/color.go @@ -19,3 +19,6 @@ func SetBrightBlue(s string) string { return fmt.Sprintf("\033[94m%s\033[0m", func SetBrightMagenta(s string) string { return fmt.Sprintf("\033[95m%s\033[0m", s) } func SetBrightCyan(s string) string { return fmt.Sprintf("\033[96m%s\033[0m", s) } func SetBrightWhite(s string) string { return fmt.Sprintf("\033[97m%s\033[0m", s) } + +func PrintError() string { return SetRed("Error") } +func PrintWarn() string { return SetYellow("Warning") } diff --git a/core/logs/logger.go b/core/logs/logger.go index deeec53..a78e685 100644 --- a/core/logs/logger.go +++ b/core/logs/logger.go @@ -4,29 +4,84 @@ package logs import ( + "bytes" + "context" + "io" "log/slog" "os" + "path/filepath" + "regexp" + "strings" + + "github.com/akyaiy/GoSally-mvp/core/config" + "github.com/akyaiy/GoSally-mvp/core/run_manager" + "gopkg.in/natefinch/lumberjack.v2" ) -// Environment constants for logger setup -const ( - // envDev enables development logging with debug level - envDev = "dev" - // envProd enables production logging with info level - envProd = "prod" -) +var GlobalLevel slog.Level + +type SlogWriter struct { + Logger *slog.Logger + Level slog.Level +} + +func (w *SlogWriter) Write(p []byte) (n int, err error) { + msg := string(bytes.TrimSpace(p)) + w.Logger.Log(context.TODO(), w.Level, msg) + return len(p), nil +} // SetupLogger initializes and returns a logger based on the provided environment. -func SetupLogger(env string) *slog.Logger { - var log *slog.Logger - switch env { - case envDev: - log = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})) - case envProd: - log = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})) +func SetupLogger(o config.Log) (*slog.Logger, error) { + var handlerOpts = slog.HandlerOptions{} + var writer io.Writer = os.Stdout + + switch o.Level { + case "debug": + GlobalLevel = slog.LevelDebug + handlerOpts.Level = slog.LevelDebug + case "info": + GlobalLevel = slog.LevelInfo + handlerOpts.Level = slog.LevelInfo default: - log = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})) + GlobalLevel = slog.LevelInfo + handlerOpts.Level = slog.LevelInfo } - return log + if o.OutPath != "" { + repl := map[string]string{ + "tmp": filepath.Clean(run_manager.RuntimeDir()), + } + re := regexp.MustCompile(`%(\w+)%`) + result := re.ReplaceAllStringFunc(o.OutPath, func(match string) string { + sub := re.FindStringSubmatch(match) + if len(sub) < 2 { + return match + } + key := sub[1] + if val, ok := repl[key]; ok { + return val + } + return match + }) + + if strings.Contains(o.OutPath, "%tmp%") { + relPath := strings.TrimPrefix(result, filepath.Clean(run_manager.RuntimeDir())) + if err := run_manager.SetDir(relPath); err != nil { + return nil, err + } + } + + logFile := &lumberjack.Logger{ + Filename: filepath.Join(result, "event.log"), + MaxSize: 10, + MaxBackups: 5, + MaxAge: 28, + Compress: true, + } + writer = logFile + } + + log := slog.New(slog.NewJSONHandler(writer, &handlerOpts)) + return log, nil }