logger.go 3.0 KB

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