Skip to content

Instantly share code, notes, and snippets.

@m-mizutani
Created February 11, 2023 02:10
Show Gist options
  • Save m-mizutani/6e258c17f547b249934b646663c181d8 to your computer and use it in GitHub Desktop.
Save m-mizutani/6e258c17f547b249934b646663c181d8 to your computer and use it in GitHub Desktop.
reconfigurable slog logger
package utils
import (
"io"
"os"
"sync"
"github.com/m-mizutani/goerr"
"golang.org/x/exp/slog"
)
var logger = slog.Default()
var loggerMutex sync.Mutex
func Logger() *slog.Logger {
return logger
}
func ReconfigureLogger(format, level, output string) error {
logLevelMap := map[string]slog.Level{
"debug": slog.LevelDebug,
"info": slog.LevelInfo,
"warn": slog.LevelWarn,
"error": slog.LevelError,
}
logLevel, ok := logLevelMap[level]
if !ok {
return goerr.New("invalid log format, should be 'debug', 'info', 'warn' or 'error'").With("actual", level)
}
var w io.Writer
switch output {
case "-", "stdout":
w = os.Stdout
case "stderr":
w = os.Stderr
default:
fd, err := os.Create(output)
if err != nil {
return goerr.Wrap(err, "opening log file")
}
w = fd
}
opt := slog.HandlerOptions{
AddSource: logLevel <= slog.LevelDebug,
Level: logLevel,
}
var newLogger *slog.Logger
switch format {
case "text":
newLogger = slog.New(opt.NewTextHandler(w))
case "json":
newLogger = slog.New(opt.NewJSONHandler(w))
default:
return goerr.New("invalid log format, should be 'text' or 'json'").With("actual", format)
}
loggerMutex.Lock()
logger = newLogger
loggerMutex.Unlock()
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment