logger.go 3.0 KB

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