feat: logger_new y logger_with sobre log/slog (infra)
- logger_new (impuro): construye *Logger con handler JSON/text segun formato - logger_with (puro): clona el Logger anadiendo campos contextuales via slog.With Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package infra
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"os"
|
||||
)
|
||||
|
||||
// LoggerNew crea un Logger con nivel, destino y formato configurables.
|
||||
// format debe ser "json" o "text". Si output es nil se usa os.Stderr.
|
||||
// Retorna error si el formato no es valido.
|
||||
func LoggerNew(level LogLevel, output io.Writer, format string) (*Logger, error) {
|
||||
if output == nil {
|
||||
output = os.Stderr
|
||||
}
|
||||
|
||||
slogLevel := toSlogLevel(level)
|
||||
opts := &slog.HandlerOptions{Level: slogLevel}
|
||||
|
||||
var handler slog.Handler
|
||||
switch format {
|
||||
case "json":
|
||||
handler = slog.NewJSONHandler(output, opts)
|
||||
case "text":
|
||||
handler = slog.NewTextHandler(output, opts)
|
||||
default:
|
||||
return nil, fmt.Errorf("logger_new: formato invalido %q, usa \"json\" o \"text\"", format)
|
||||
}
|
||||
|
||||
return &Logger{
|
||||
Level: level,
|
||||
Output: output,
|
||||
Format: format,
|
||||
Fields: map[string]any{},
|
||||
inner: slog.New(handler),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// toSlogLevel convierte LogLevel a slog.Level.
|
||||
func toSlogLevel(level LogLevel) slog.Level {
|
||||
switch level {
|
||||
case LogLevelDebug:
|
||||
return slog.LevelDebug
|
||||
case LogLevelInfo:
|
||||
return slog.LevelInfo
|
||||
case LogLevelWarn:
|
||||
return slog.LevelWarn
|
||||
case LogLevelError:
|
||||
return slog.LevelError
|
||||
default:
|
||||
return slog.LevelInfo
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user