mirror of
https://github.com/akyaiy/GoSally-mvp.git
synced 2026-01-03 04:52:26 +00:00
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
// Package logs provides a logger setup function that configures the logger based on the environment.
|
|
// It supports different logging levels for development and production environments.
|
|
// It uses the standard library's slog package for structured logging.
|
|
package logs
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"log/slog"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/akyaiy/GoSally-mvp/internal/engine/config"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
var GlobalLevel slog.Level
|
|
|
|
type levelsStruct struct {
|
|
Available []string
|
|
Fallback string
|
|
}
|
|
|
|
var Levels = levelsStruct{
|
|
Available: []string{
|
|
"debug", "info",
|
|
},
|
|
Fallback: "info",
|
|
}
|
|
|
|
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(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:
|
|
GlobalLevel = slog.LevelInfo
|
|
handlerOpts.Level = slog.LevelInfo
|
|
}
|
|
|
|
switch *o.OutPath {
|
|
case "_1STDout":
|
|
writer = os.Stdout
|
|
case "_2STDerr":
|
|
writer = os.Stderr
|
|
default:
|
|
logFile := &lumberjack.Logger{
|
|
Filename: filepath.Join(*o.OutPath, "event.log"),
|
|
MaxSize: 10,
|
|
MaxBackups: 5,
|
|
MaxAge: 28,
|
|
Compress: true,
|
|
}
|
|
writer = logFile
|
|
}
|
|
|
|
var handler slog.Handler
|
|
|
|
if *o.JSON {
|
|
handler = slog.NewJSONHandler(writer, &handlerOpts)
|
|
} else {
|
|
handler = slog.NewTextHandler(writer, &handlerOpts)
|
|
}
|
|
log := slog.New(handler)
|
|
return log, nil
|
|
}
|