logger.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. //
  3. // This program is free software: you can redistribute it and/or modify it
  4. // under the terms of the GNU General Public License as published by the Free
  5. // Software Foundation, either version 3 of the License, or (at your option)
  6. // any later version.
  7. //
  8. // This program is distributed in the hope that it will be useful, but WITHOUT
  9. // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10. // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  11. // more details.
  12. //
  13. // You should have received a copy of the GNU General Public License along
  14. // with this program. If not, see <http://www.gnu.org/licenses/>.
  15. // Package logger implements a standardized logger with callback functionality
  16. package logger
  17. import (
  18. "fmt"
  19. "log"
  20. "os"
  21. "strings"
  22. "sync"
  23. )
  24. type LogLevel int
  25. const (
  26. LevelDebug LogLevel = iota
  27. LevelInfo
  28. LevelOK
  29. LevelWarn
  30. LevelFatal
  31. NumLevels
  32. )
  33. type MessageHandler func(l LogLevel, msg string)
  34. type Logger struct {
  35. logger *log.Logger
  36. handlers [NumLevels][]MessageHandler
  37. mut sync.Mutex
  38. }
  39. var DefaultLogger = New()
  40. func New() *Logger {
  41. return &Logger{
  42. logger: log.New(os.Stdout, "", log.Ltime),
  43. }
  44. }
  45. func (l *Logger) AddHandler(level LogLevel, h MessageHandler) {
  46. l.mut.Lock()
  47. defer l.mut.Unlock()
  48. l.handlers[level] = append(l.handlers[level], h)
  49. }
  50. func (l *Logger) SetFlags(flag int) {
  51. l.logger.SetFlags(flag)
  52. }
  53. func (l *Logger) SetPrefix(prefix string) {
  54. l.logger.SetPrefix(prefix)
  55. }
  56. func (l *Logger) callHandlers(level LogLevel, s string) {
  57. for _, h := range l.handlers[level] {
  58. h(level, strings.TrimSpace(s))
  59. }
  60. }
  61. func (l *Logger) Debugln(vals ...interface{}) {
  62. l.mut.Lock()
  63. defer l.mut.Unlock()
  64. s := fmt.Sprintln(vals...)
  65. l.logger.Output(2, "DEBUG: "+s)
  66. l.callHandlers(LevelDebug, s)
  67. }
  68. func (l *Logger) Debugf(format string, vals ...interface{}) {
  69. l.mut.Lock()
  70. defer l.mut.Unlock()
  71. s := fmt.Sprintf(format, vals...)
  72. l.logger.Output(2, "DEBUG: "+s)
  73. l.callHandlers(LevelDebug, s)
  74. }
  75. func (l *Logger) Infoln(vals ...interface{}) {
  76. l.mut.Lock()
  77. defer l.mut.Unlock()
  78. s := fmt.Sprintln(vals...)
  79. l.logger.Output(2, "INFO: "+s)
  80. l.callHandlers(LevelInfo, s)
  81. }
  82. func (l *Logger) Infof(format string, vals ...interface{}) {
  83. l.mut.Lock()
  84. defer l.mut.Unlock()
  85. s := fmt.Sprintf(format, vals...)
  86. l.logger.Output(2, "INFO: "+s)
  87. l.callHandlers(LevelInfo, s)
  88. }
  89. func (l *Logger) Okln(vals ...interface{}) {
  90. l.mut.Lock()
  91. defer l.mut.Unlock()
  92. s := fmt.Sprintln(vals...)
  93. l.logger.Output(2, "OK: "+s)
  94. l.callHandlers(LevelOK, s)
  95. }
  96. func (l *Logger) Okf(format string, vals ...interface{}) {
  97. l.mut.Lock()
  98. defer l.mut.Unlock()
  99. s := fmt.Sprintf(format, vals...)
  100. l.logger.Output(2, "OK: "+s)
  101. l.callHandlers(LevelOK, s)
  102. }
  103. func (l *Logger) Warnln(vals ...interface{}) {
  104. l.mut.Lock()
  105. defer l.mut.Unlock()
  106. s := fmt.Sprintln(vals...)
  107. l.logger.Output(2, "WARNING: "+s)
  108. l.callHandlers(LevelWarn, s)
  109. }
  110. func (l *Logger) Warnf(format string, vals ...interface{}) {
  111. l.mut.Lock()
  112. defer l.mut.Unlock()
  113. s := fmt.Sprintf(format, vals...)
  114. l.logger.Output(2, "WARNING: "+s)
  115. l.callHandlers(LevelWarn, s)
  116. }
  117. func (l *Logger) Fatalln(vals ...interface{}) {
  118. l.mut.Lock()
  119. defer l.mut.Unlock()
  120. s := fmt.Sprintln(vals...)
  121. l.logger.Output(2, "FATAL: "+s)
  122. l.callHandlers(LevelFatal, s)
  123. os.Exit(1)
  124. }
  125. func (l *Logger) Fatalf(format string, vals ...interface{}) {
  126. l.mut.Lock()
  127. defer l.mut.Unlock()
  128. s := fmt.Sprintf(format, vals...)
  129. l.logger.Output(2, "FATAL: "+s)
  130. l.callHandlers(LevelFatal, s)
  131. os.Exit(1)
  132. }