Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

28 wiersze
831 B

  1. package logger
  2. import (
  3. "io"
  4. "log/slog"
  5. "os"
  6. )
  7. // CreateLogger creates a logger writing to both stderr and the given file.
  8. // If the file cannot be opened, returns a logger that writes only to stderr and a no-op cleanup.
  9. // Log level is controlled by the LOG_LEVEL env var (debug/info/warn/error); defaults to info.
  10. func CreateLogger(fname string) (*slog.Logger, func()) {
  11. lvl := &slog.LevelVar{}
  12. if v := os.Getenv("LOG_LEVEL"); v != "" {
  13. _ = lvl.UnmarshalText([]byte(v))
  14. }
  15. opts := &slog.HandlerOptions{Level: lvl}
  16. f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
  17. if err != nil {
  18. return slog.New(slog.NewJSONHandler(os.Stderr, opts)), func() {}
  19. }
  20. w := io.MultiWriter(os.Stderr, f)
  21. logger := slog.New(slog.NewJSONHandler(w, opts))
  22. cleanup := func() { f.Close() }
  23. return logger, cleanup
  24. }