|
- package logger
-
- import (
- "io"
- "log/slog"
- "os"
- )
-
- // CreateLogger creates a logger writing to both stderr and the given file.
- // If the file cannot be opened, returns a logger that writes only to stderr and a no-op cleanup.
- // Log level is controlled by the LOG_LEVEL env var (debug/info/warn/error); defaults to info.
- func CreateLogger(fname string) (*slog.Logger, func()) {
- lvl := &slog.LevelVar{}
- if v := os.Getenv("LOG_LEVEL"); v != "" {
- _ = lvl.UnmarshalText([]byte(v))
- }
- opts := &slog.HandlerOptions{Level: lvl}
-
- f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
- if err != nil {
- return slog.New(slog.NewJSONHandler(os.Stderr, opts)), func() {}
- }
- w := io.MultiWriter(os.Stderr, f)
- logger := slog.New(slog.NewJSONHandler(w, opts))
- cleanup := func() { f.Close() }
- return logger, cleanup
- }
|