sloginit.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Copyright (C) 2025 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package slogutil
  7. import (
  8. "io"
  9. "log/slog"
  10. "os"
  11. "time"
  12. )
  13. var (
  14. GlobalRecorder = &lineRecorder{level: -1000}
  15. ErrorRecorder = &lineRecorder{level: slog.LevelError}
  16. DefaultLineFormat = LineFormat{
  17. TimestampFormat: time.DateTime,
  18. LevelString: true,
  19. }
  20. globalLevels = &levelTracker{
  21. levels: make(map[string]slog.Level),
  22. descrs: make(map[string]string),
  23. }
  24. globalFormatter = &formattingOptions{
  25. LineFormat: DefaultLineFormat,
  26. recs: []*lineRecorder{GlobalRecorder, ErrorRecorder},
  27. out: logWriter(),
  28. }
  29. slogDef = slog.New(&formattingHandler{opts: globalFormatter})
  30. )
  31. func logWriter() io.Writer {
  32. if os.Getenv("LOGGER_DISCARD") != "" {
  33. // Hack to completely disable logging, for example when running
  34. // benchmarks.
  35. return io.Discard
  36. }
  37. return os.Stdout
  38. }
  39. func init() {
  40. slog.SetDefault(slogDef)
  41. }