logger.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Package logger implements a standardized logger with callback functionality
  2. package logger
  3. import (
  4. "fmt"
  5. "log"
  6. "os"
  7. "sync"
  8. )
  9. type LogLevel int
  10. const (
  11. LevelDebug LogLevel = iota
  12. LevelInfo
  13. LevelOK
  14. LevelWarn
  15. LevelFatal
  16. NumLevels
  17. )
  18. type MessageHandler func(l LogLevel, msg string)
  19. type Logger struct {
  20. logger *log.Logger
  21. handlers [NumLevels][]MessageHandler
  22. mut sync.Mutex
  23. }
  24. var DefaultLogger = New()
  25. func New() *Logger {
  26. return &Logger{
  27. logger: log.New(os.Stderr, "", log.Ltime),
  28. }
  29. }
  30. func (l *Logger) AddHandler(level LogLevel, h MessageHandler) {
  31. l.mut.Lock()
  32. defer l.mut.Unlock()
  33. l.handlers[level] = append(l.handlers[level], h)
  34. }
  35. func (l *Logger) SetFlags(flag int) {
  36. l.logger.SetFlags(flag)
  37. }
  38. func (l *Logger) SetPrefix(prefix string) {
  39. l.logger.SetPrefix(prefix)
  40. }
  41. func (l *Logger) callHandlers(level LogLevel, s string) {
  42. for _, h := range l.handlers[level] {
  43. h(level, s)
  44. }
  45. }
  46. func (l *Logger) Debugln(vals ...interface{}) {
  47. l.mut.Lock()
  48. defer l.mut.Unlock()
  49. s := fmt.Sprintln(vals...)
  50. l.logger.Output(2, "DEBUG: "+s)
  51. l.callHandlers(LevelDebug, s)
  52. }
  53. func (l *Logger) Debugf(format string, vals ...interface{}) {
  54. l.mut.Lock()
  55. defer l.mut.Unlock()
  56. s := fmt.Sprintf(format, vals...)
  57. l.logger.Output(2, "DEBUG: "+s)
  58. l.callHandlers(LevelDebug, s)
  59. }
  60. func (l *Logger) Infoln(vals ...interface{}) {
  61. l.mut.Lock()
  62. defer l.mut.Unlock()
  63. s := fmt.Sprintln(vals...)
  64. l.logger.Output(2, "INFO: "+s)
  65. l.callHandlers(LevelInfo, s)
  66. }
  67. func (l *Logger) Infof(format string, vals ...interface{}) {
  68. l.mut.Lock()
  69. defer l.mut.Unlock()
  70. s := fmt.Sprintf(format, vals...)
  71. l.logger.Output(2, "INFO: "+s)
  72. l.callHandlers(LevelInfo, s)
  73. }
  74. func (l *Logger) Okln(vals ...interface{}) {
  75. l.mut.Lock()
  76. defer l.mut.Unlock()
  77. s := fmt.Sprintln(vals...)
  78. l.logger.Output(2, "OK: "+s)
  79. l.callHandlers(LevelOK, s)
  80. }
  81. func (l *Logger) Okf(format string, vals ...interface{}) {
  82. l.mut.Lock()
  83. defer l.mut.Unlock()
  84. s := fmt.Sprintf(format, vals...)
  85. l.logger.Output(2, "OK: "+s)
  86. l.callHandlers(LevelOK, s)
  87. }
  88. func (l *Logger) Warnln(vals ...interface{}) {
  89. l.mut.Lock()
  90. defer l.mut.Unlock()
  91. s := fmt.Sprintln(vals...)
  92. l.logger.Output(2, "WARNING: "+s)
  93. l.callHandlers(LevelWarn, s)
  94. }
  95. func (l *Logger) Warnf(format string, vals ...interface{}) {
  96. l.mut.Lock()
  97. defer l.mut.Unlock()
  98. s := fmt.Sprintf(format, vals...)
  99. l.logger.Output(2, "WARNING: "+s)
  100. l.callHandlers(LevelWarn, s)
  101. }
  102. func (l *Logger) Fatalln(vals ...interface{}) {
  103. l.mut.Lock()
  104. defer l.mut.Unlock()
  105. s := fmt.Sprintln(vals...)
  106. l.logger.Output(2, "FATAL: "+s)
  107. l.callHandlers(LevelFatal, s)
  108. os.Exit(3)
  109. }
  110. func (l *Logger) Fatalf(format string, vals ...interface{}) {
  111. l.mut.Lock()
  112. defer l.mut.Unlock()
  113. s := fmt.Sprintf(format, vals...)
  114. l.logger.Output(2, "FATAL: "+s)
  115. l.callHandlers(LevelFatal, s)
  116. os.Exit(3)
  117. }
  118. func (l *Logger) FatalErr(err error) {
  119. if err != nil {
  120. l.Fatalf(err.Error())
  121. }
  122. }