This commit is contained in:
alex
2025-07-12 13:25:42 +03:00
parent aa45a2e3e4
commit deef4a891b
2 changed files with 74 additions and 16 deletions

View File

@@ -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 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 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 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") }

View File

@@ -4,29 +4,84 @@
package logs package logs
import ( import (
"bytes"
"context"
"io"
"log/slog" "log/slog"
"os" "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 var GlobalLevel slog.Level
const (
// envDev enables development logging with debug level type SlogWriter struct {
envDev = "dev" Logger *slog.Logger
// envProd enables production logging with info level Level slog.Level
envProd = "prod" }
)
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. // SetupLogger initializes and returns a logger based on the provided environment.
func SetupLogger(env string) *slog.Logger { func SetupLogger(o config.Log) (*slog.Logger, error) {
var log *slog.Logger var handlerOpts = slog.HandlerOptions{}
switch env { var writer io.Writer = os.Stdout
case envDev:
log = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})) switch o.Level {
case envProd: case "debug":
log = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})) GlobalLevel = slog.LevelDebug
handlerOpts.Level = slog.LevelDebug
case "info":
GlobalLevel = slog.LevelInfo
handlerOpts.Level = slog.LevelInfo
default: 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
} }