logger.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package log
  2. import (
  3. "fmt"
  4. "log/slog"
  5. )
  6. // Returns a new Logger with the names given, and Default's handlers. I'm not sure copying those
  7. // handlers is the right choice yet, but it's better than having your messages vanish if you forget
  8. // to configure them.
  9. func NewLogger(names ...string) Logger {
  10. l := Default
  11. l.names = nil
  12. return l.WithNames(names...)
  13. }
  14. // Logger handles logging in a specific context. It includes a bunch of helpers and compatibility
  15. // over the loggerCore.
  16. type Logger struct {
  17. loggerCore
  18. }
  19. func (l Logger) WithText(f func(Msg) string) Logger {
  20. l.msgMaps = append(l.msgMaps, func(msg Msg) Msg {
  21. return msg.WithText(f)
  22. })
  23. return l
  24. }
  25. // Helper for compatibility with "log".Logger.
  26. func (l Logger) Printf(format string, a ...interface{}) {
  27. l.LazyLog(l.defaultLevel, func() Msg {
  28. return Fmsg(format, a...).Skip(1)
  29. })
  30. }
  31. func (l Logger) Log(m Msg) {
  32. l.LogLevel(l.defaultLevel, m.Skip(1))
  33. }
  34. func (l Logger) LogLevel(level Level, m Msg) {
  35. l.LazyLog(level, func() Msg {
  36. return m.Skip(1)
  37. })
  38. }
  39. // Helper for compatibility with "log".Logger.
  40. func (l Logger) Print(v ...interface{}) {
  41. l.LazyLog(l.defaultLevel, func() Msg {
  42. return Str(fmt.Sprint(v...)).Skip(1)
  43. })
  44. }
  45. func (l Logger) WithContextValue(v interface{}) Logger {
  46. return l.WithText(func(m Msg) string {
  47. return fmt.Sprintf("%v: %v", v, m)
  48. })
  49. }
  50. func (l Logger) WithContextText(s string) Logger {
  51. return l.WithText(func(m Msg) string {
  52. return s + ": " + m.Text()
  53. })
  54. }
  55. func (l Logger) SkipCallers(skip int) Logger {
  56. return l.WithMap(func(m Msg) Msg {
  57. return m.Skip(skip)
  58. })
  59. }
  60. func (l Logger) Levelf(level Level, format string, a ...interface{}) {
  61. l.LazyLog(level, func() Msg {
  62. return Fmsg(format, a...).Skip(1)
  63. })
  64. }
  65. // Efficiently print arguments at the given level.
  66. func (l Logger) LevelPrint(level Level, a ...interface{}) {
  67. l.LazyLog(level, func() Msg {
  68. return Str(fmt.Sprint(a...)).Skip(1)
  69. })
  70. }
  71. func (l Logger) Println(a ...interface{}) {
  72. l.LazyLogDefaultLevel(func() Msg {
  73. return Msgln(a...).Skip(1)
  74. })
  75. }
  76. func (l Logger) Slogger() *slog.Logger {
  77. return slog.New(slogHandler{l})
  78. }