event.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package log
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "os"
  7. "sort"
  8. "strings"
  9. "time"
  10. )
  11. const (
  12. tagField = "tag"
  13. errorField = "error"
  14. )
  15. type Event struct {
  16. Time int64 `json:"time"`
  17. Level Level `json:"level"`
  18. Message string `json:"message"`
  19. fields map[string]any
  20. }
  21. func newEvent() *Event {
  22. return &Event{
  23. Time: time.Now().UnixMilli(),
  24. fields: make(map[string]any),
  25. }
  26. }
  27. func (e *Event) Fatal(message string, v ...any) {
  28. e.Log(FatalLevel, message, v...)
  29. os.Exit(1)
  30. }
  31. func (e *Event) Error(message string, v ...any) {
  32. e.Log(ErrorLevel, message, v...)
  33. }
  34. func (e *Event) Warn(message string, v ...any) {
  35. e.Log(WarnLevel, message, v...)
  36. }
  37. func (e *Event) Info(message string, v ...any) {
  38. e.Log(InfoLevel, message, v...)
  39. }
  40. func (e *Event) Debug(message string, v ...any) {
  41. e.Log(DebugLevel, message, v...)
  42. }
  43. func (e *Event) Trace(message string, v ...any) {
  44. e.Log(TraceLevel, message, v...)
  45. }
  46. func (e *Event) Tag(tag string) *Event {
  47. e.fields[tagField] = tag
  48. return e
  49. }
  50. func (e *Event) Err(err error) *Event {
  51. e.fields[errorField] = err
  52. return e
  53. }
  54. func (e *Event) Field(key string, value any) *Event {
  55. e.fields[key] = value
  56. return e
  57. }
  58. func (e *Event) Fields(fields map[string]any) *Event {
  59. for k, v := range fields {
  60. e.fields[k] = v
  61. }
  62. return e
  63. }
  64. func (e *Event) Context(contexts ...Ctx) *Event {
  65. for _, c := range contexts {
  66. e.Fields(c.Context())
  67. }
  68. return e
  69. }
  70. func (e *Event) Log(l Level, message string, v ...any) {
  71. e.Message = fmt.Sprintf(message, v...)
  72. e.Level = l
  73. if e.shouldPrint() {
  74. if CurrentFormat() == JSONFormat {
  75. log.Println(e.JSON())
  76. } else {
  77. log.Println(e.String())
  78. }
  79. }
  80. }
  81. // Loggable returns true if the given log level is lower or equal to the current log level
  82. func (e *Event) Loggable(l Level) bool {
  83. return e.globalLevelWithOverride() <= l
  84. }
  85. // IsTrace returns true if the current log level is TraceLevel
  86. func (e *Event) IsTrace() bool {
  87. return e.Loggable(TraceLevel)
  88. }
  89. // IsDebug returns true if the current log level is DebugLevel or below
  90. func (e *Event) IsDebug() bool {
  91. return e.Loggable(DebugLevel)
  92. }
  93. func (e *Event) JSON() string {
  94. b, _ := json.Marshal(e)
  95. s := string(b)
  96. if len(e.fields) > 0 {
  97. b, _ := json.Marshal(e.fields)
  98. s = fmt.Sprintf("{%s,%s}", s[1:len(s)-1], string(b[1:len(b)-1]))
  99. }
  100. return s
  101. }
  102. func (e *Event) String() string {
  103. if len(e.fields) == 0 {
  104. return fmt.Sprintf("%s %s", e.Level.String(), e.Message)
  105. }
  106. fields := make([]string, 0)
  107. for k, v := range e.fields {
  108. fields = append(fields, fmt.Sprintf("%s=%v", k, v))
  109. }
  110. sort.Strings(fields)
  111. return fmt.Sprintf("%s %s (%s)", e.Level.String(), e.Message, strings.Join(fields, ", "))
  112. }
  113. func (e *Event) shouldPrint() bool {
  114. return e.globalLevelWithOverride() <= e.Level
  115. }
  116. func (e *Event) globalLevelWithOverride() Level {
  117. mu.Lock()
  118. l, ov := level, overrides
  119. mu.Unlock()
  120. for field, override := range ov {
  121. value, exists := e.fields[field]
  122. if exists && value == override.value {
  123. return override.level
  124. }
  125. }
  126. return l
  127. }