log.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package log
  2. import (
  3. "fmt"
  4. "io"
  5. "os"
  6. "sync"
  7. "github.com/mattn/go-colorable"
  8. "github.com/mattn/go-isatty"
  9. "github.com/labstack/gommon/color"
  10. )
  11. type (
  12. Logger struct {
  13. level Level
  14. levels []string
  15. color color.Color
  16. out io.Writer
  17. prefix string
  18. mu sync.Mutex
  19. }
  20. Level uint8
  21. )
  22. const (
  23. DEBUG = iota
  24. INFO
  25. WARN
  26. ERROR
  27. FATAL
  28. OFF
  29. )
  30. var (
  31. global = New("-")
  32. )
  33. func New(prefix string) (l *Logger) {
  34. l = &Logger{
  35. level: INFO,
  36. prefix: prefix,
  37. }
  38. l.SetOutput(colorable.NewColorableStdout())
  39. return
  40. }
  41. func (l *Logger) initLevels() {
  42. l.levels = []string{
  43. l.color.Blue("DEBUG"),
  44. l.color.Green("INFO"),
  45. l.color.Yellow("WARN"),
  46. l.color.Red("ERROR"),
  47. l.color.RedBg("FATAL"),
  48. }
  49. }
  50. func (l *Logger) DisableColor() {
  51. l.color.Disable()
  52. l.initLevels()
  53. }
  54. func (l *Logger) EnableColor() {
  55. l.color.Enable()
  56. l.initLevels()
  57. }
  58. func (l *Logger) SetPrefix(p string) {
  59. l.prefix = p
  60. }
  61. func (l *Logger) SetLevel(v Level) {
  62. l.level = v
  63. }
  64. func (l *Logger) Level() Level {
  65. return l.level
  66. }
  67. func (l *Logger) SetOutput(w io.Writer) {
  68. l.out = w
  69. l.DisableColor()
  70. if w, ok := w.(*os.File); ok && isatty.IsTerminal(w.Fd()) {
  71. l.EnableColor()
  72. }
  73. }
  74. func (l *Logger) Print(i ...interface{}) {
  75. fmt.Fprintln(l.out, i...)
  76. }
  77. func (l *Logger) Printf(format string, args ...interface{}) {
  78. f := fmt.Sprintf("%s\n", format)
  79. fmt.Fprintf(l.out, f, args...)
  80. }
  81. func (l *Logger) Debug(i ...interface{}) {
  82. l.log(DEBUG, "", i...)
  83. }
  84. func (l *Logger) Debugf(format string, args ...interface{}) {
  85. l.log(DEBUG, format, args...)
  86. }
  87. func (l *Logger) Info(i ...interface{}) {
  88. l.log(INFO, "", i...)
  89. }
  90. func (l *Logger) Infof(format string, args ...interface{}) {
  91. l.log(INFO, format, args...)
  92. }
  93. func (l *Logger) Warn(i ...interface{}) {
  94. l.log(WARN, "", i...)
  95. }
  96. func (l *Logger) Warnf(format string, args ...interface{}) {
  97. l.log(WARN, format, args...)
  98. }
  99. func (l *Logger) Error(i ...interface{}) {
  100. l.log(ERROR, "", i...)
  101. }
  102. func (l *Logger) Errorf(format string, args ...interface{}) {
  103. l.log(ERROR, format, args...)
  104. }
  105. func (l *Logger) Fatal(i ...interface{}) {
  106. l.log(FATAL, "", i...)
  107. os.Exit(1)
  108. }
  109. func (l *Logger) Fatalf(format string, args ...interface{}) {
  110. l.log(FATAL, format, args...)
  111. os.Exit(1)
  112. }
  113. func DisableColor() {
  114. global.DisableColor()
  115. }
  116. func EnableColor() {
  117. global.EnableColor()
  118. }
  119. func SetPrefix(p string) {
  120. global.SetPrefix(p)
  121. }
  122. func SetLevel(v Level) {
  123. global.SetLevel(v)
  124. }
  125. func SetOutput(w io.Writer) {
  126. global.SetOutput(w)
  127. }
  128. func Print(i ...interface{}) {
  129. global.Print(i...)
  130. }
  131. func Printf(format string, args ...interface{}) {
  132. global.Printf(format, args...)
  133. }
  134. func Debug(i ...interface{}) {
  135. global.Debug(i...)
  136. }
  137. func Debugf(format string, args ...interface{}) {
  138. global.Debugf(format, args...)
  139. }
  140. func Info(i ...interface{}) {
  141. global.Info(i...)
  142. }
  143. func Infof(format string, args ...interface{}) {
  144. global.Infof(format, args...)
  145. }
  146. func Warn(i ...interface{}) {
  147. global.Warn(i...)
  148. }
  149. func Warnf(format string, args ...interface{}) {
  150. global.Warnf(format, args...)
  151. }
  152. func Error(i ...interface{}) {
  153. global.Error(i...)
  154. }
  155. func Errorf(format string, args ...interface{}) {
  156. global.Errorf(format, args...)
  157. }
  158. func Fatal(i ...interface{}) {
  159. global.Fatal(i...)
  160. }
  161. func Fatalf(format string, args ...interface{}) {
  162. global.Fatalf(format, args...)
  163. }
  164. func (l *Logger) log(v Level, format string, args ...interface{}) {
  165. l.mu.Lock()
  166. defer l.mu.Unlock()
  167. if v >= l.level {
  168. if format == "" && len(args) > 0 {
  169. args[0] = fmt.Sprintf("%s|%s|%v", l.levels[v], l.prefix, args[0])
  170. fmt.Fprintln(l.out, args...)
  171. } else {
  172. // TODO: Improve performance
  173. f := fmt.Sprintf("%s|%s|%s\n", l.levels[v], l.prefix, format)
  174. fmt.Fprintf(l.out, f, args...)
  175. }
  176. }
  177. }