logger.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package util
  2. import (
  3. "fmt"
  4. "github.com/fatih/color"
  5. "sync"
  6. "time"
  7. )
  8. const (
  9. // LevelError 错误
  10. LevelError = iota
  11. // LevelWarning 警告
  12. LevelWarning
  13. // LevelInformational 提示
  14. LevelInformational
  15. // LevelDebug 除错
  16. LevelDebug
  17. )
  18. var GloablLogger *Logger
  19. var Level = LevelDebug
  20. // Logger 日志
  21. type Logger struct {
  22. level int
  23. mu sync.Mutex
  24. }
  25. // 日志颜色
  26. var colors = map[string]func(a ...interface{}) string{
  27. "Warning": color.New(color.FgYellow).Add(color.Bold).SprintFunc(),
  28. "Panic": color.New(color.BgRed).Add(color.Bold).SprintFunc(),
  29. "Error": color.New(color.FgRed).Add(color.Bold).SprintFunc(),
  30. "Info": color.New(color.FgCyan).Add(color.Bold).SprintFunc(),
  31. "Debug": color.New(color.FgWhite).Add(color.Bold).SprintFunc(),
  32. }
  33. // 不同级别前缀与时间的间隔,保持宽度一致
  34. var spaces = map[string]string{
  35. "Warning": "",
  36. "Panic": " ",
  37. "Error": " ",
  38. "Info": " ",
  39. "Debug": " ",
  40. }
  41. // Println 打印
  42. func (ll *Logger) Println(prefix string, msg string) {
  43. // TODO Release时去掉
  44. c := color.New()
  45. ll.mu.Lock()
  46. defer ll.mu.Unlock()
  47. _, _ = c.Printf(
  48. "%s%s %s %s\n",
  49. colors[prefix]("["+prefix+"]"),
  50. spaces[prefix],
  51. time.Now().Format("2006-01-02 15:04:05"),
  52. msg,
  53. )
  54. }
  55. // Panic 极端错误
  56. func (ll *Logger) Panic(format string, v ...interface{}) {
  57. if LevelError > ll.level {
  58. return
  59. }
  60. msg := fmt.Sprintf(format, v...)
  61. ll.Println("Panic", msg)
  62. panic(msg)
  63. }
  64. // Error 错误
  65. func (ll *Logger) Error(format string, v ...interface{}) {
  66. if LevelError > ll.level {
  67. return
  68. }
  69. msg := fmt.Sprintf(format, v...)
  70. ll.Println("Error", msg)
  71. }
  72. // Warning 警告
  73. func (ll *Logger) Warning(format string, v ...interface{}) {
  74. if LevelWarning > ll.level {
  75. return
  76. }
  77. msg := fmt.Sprintf(format, v...)
  78. ll.Println("Warning", msg)
  79. }
  80. // Info 信息
  81. func (ll *Logger) Info(format string, v ...interface{}) {
  82. if LevelInformational > ll.level {
  83. return
  84. }
  85. msg := fmt.Sprintf(format, v...)
  86. ll.Println("Info", msg)
  87. }
  88. // Debug 校验
  89. func (ll *Logger) Debug(format string, v ...interface{}) {
  90. if LevelDebug > ll.level {
  91. return
  92. }
  93. msg := fmt.Sprintf(format, v...)
  94. ll.Println("Debug", msg)
  95. }
  96. // BuildLogger 构建logger
  97. func BuildLogger(level string) {
  98. intLevel := LevelError
  99. switch level {
  100. case "error":
  101. intLevel = LevelError
  102. case "warning":
  103. intLevel = LevelWarning
  104. case "info":
  105. intLevel = LevelInformational
  106. case "debug":
  107. intLevel = LevelDebug
  108. }
  109. l := Logger{
  110. level: intLevel,
  111. }
  112. GloablLogger = &l
  113. }
  114. // Log 返回日志对象
  115. func Log() *Logger {
  116. if GloablLogger == nil {
  117. l := Logger{
  118. level: Level,
  119. }
  120. GloablLogger = &l
  121. }
  122. return GloablLogger
  123. }