logger.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. // Copyright 2015 The Xorm Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package log
  5. import (
  6. "fmt"
  7. "io"
  8. "log"
  9. )
  10. // LogLevel defines a log level
  11. type LogLevel int
  12. // enumerate all LogLevels
  13. const (
  14. // !nashtsai! following level also match syslog.Priority value
  15. LOG_DEBUG LogLevel = iota
  16. LOG_INFO
  17. LOG_WARNING
  18. LOG_ERR
  19. LOG_OFF
  20. LOG_UNKNOWN
  21. )
  22. // default log options
  23. const (
  24. DEFAULT_LOG_PREFIX = "[xorm]"
  25. DEFAULT_LOG_FLAG = log.Ldate | log.Lmicroseconds
  26. DEFAULT_LOG_LEVEL = LOG_DEBUG
  27. )
  28. // Logger is a logger interface
  29. type Logger interface {
  30. Debug(v ...interface{})
  31. Debugf(format string, v ...interface{})
  32. Error(v ...interface{})
  33. Errorf(format string, v ...interface{})
  34. Info(v ...interface{})
  35. Infof(format string, v ...interface{})
  36. Warn(v ...interface{})
  37. Warnf(format string, v ...interface{})
  38. Level() LogLevel
  39. SetLevel(l LogLevel)
  40. ShowSQL(show ...bool)
  41. IsShowSQL() bool
  42. }
  43. var _ Logger = DiscardLogger{}
  44. // DiscardLogger don't log implementation for ILogger
  45. type DiscardLogger struct{}
  46. // Debug empty implementation
  47. func (DiscardLogger) Debug(v ...interface{}) {}
  48. // Debugf empty implementation
  49. func (DiscardLogger) Debugf(format string, v ...interface{}) {}
  50. // Error empty implementation
  51. func (DiscardLogger) Error(v ...interface{}) {}
  52. // Errorf empty implementation
  53. func (DiscardLogger) Errorf(format string, v ...interface{}) {}
  54. // Info empty implementation
  55. func (DiscardLogger) Info(v ...interface{}) {}
  56. // Infof empty implementation
  57. func (DiscardLogger) Infof(format string, v ...interface{}) {}
  58. // Warn empty implementation
  59. func (DiscardLogger) Warn(v ...interface{}) {}
  60. // Warnf empty implementation
  61. func (DiscardLogger) Warnf(format string, v ...interface{}) {}
  62. // Level empty implementation
  63. func (DiscardLogger) Level() LogLevel {
  64. return LOG_UNKNOWN
  65. }
  66. // SetLevel empty implementation
  67. func (DiscardLogger) SetLevel(l LogLevel) {}
  68. // ShowSQL empty implementation
  69. func (DiscardLogger) ShowSQL(show ...bool) {}
  70. // IsShowSQL empty implementation
  71. func (DiscardLogger) IsShowSQL() bool {
  72. return false
  73. }
  74. // SimpleLogger is the default implment of ILogger
  75. type SimpleLogger struct {
  76. DEBUG *log.Logger
  77. ERR *log.Logger
  78. INFO *log.Logger
  79. WARN *log.Logger
  80. level LogLevel
  81. showSQL bool
  82. }
  83. var _ Logger = &SimpleLogger{}
  84. // NewSimpleLogger use a special io.Writer as logger output
  85. func NewSimpleLogger(out io.Writer) *SimpleLogger {
  86. return NewSimpleLogger2(out, DEFAULT_LOG_PREFIX, DEFAULT_LOG_FLAG)
  87. }
  88. // NewSimpleLogger2 let you customrize your logger prefix and flag
  89. func NewSimpleLogger2(out io.Writer, prefix string, flag int) *SimpleLogger {
  90. return NewSimpleLogger3(out, prefix, flag, DEFAULT_LOG_LEVEL)
  91. }
  92. // NewSimpleLogger3 let you customrize your logger prefix and flag and logLevel
  93. func NewSimpleLogger3(out io.Writer, prefix string, flag int, l LogLevel) *SimpleLogger {
  94. return &SimpleLogger{
  95. DEBUG: log.New(out, fmt.Sprintf("%s [debug] ", prefix), flag),
  96. ERR: log.New(out, fmt.Sprintf("%s [error] ", prefix), flag),
  97. INFO: log.New(out, fmt.Sprintf("%s [info] ", prefix), flag),
  98. WARN: log.New(out, fmt.Sprintf("%s [warn] ", prefix), flag),
  99. level: l,
  100. }
  101. }
  102. // Error implement ILogger
  103. func (s *SimpleLogger) Error(v ...interface{}) {
  104. if s.level <= LOG_ERR {
  105. s.ERR.Output(2, fmt.Sprintln(v...))
  106. }
  107. return
  108. }
  109. // Errorf implement ILogger
  110. func (s *SimpleLogger) Errorf(format string, v ...interface{}) {
  111. if s.level <= LOG_ERR {
  112. s.ERR.Output(2, fmt.Sprintf(format, v...))
  113. }
  114. return
  115. }
  116. // Debug implement ILogger
  117. func (s *SimpleLogger) Debug(v ...interface{}) {
  118. if s.level <= LOG_DEBUG {
  119. s.DEBUG.Output(2, fmt.Sprintln(v...))
  120. }
  121. return
  122. }
  123. // Debugf implement ILogger
  124. func (s *SimpleLogger) Debugf(format string, v ...interface{}) {
  125. if s.level <= LOG_DEBUG {
  126. s.DEBUG.Output(2, fmt.Sprintf(format, v...))
  127. }
  128. return
  129. }
  130. // Info implement ILogger
  131. func (s *SimpleLogger) Info(v ...interface{}) {
  132. if s.level <= LOG_INFO {
  133. s.INFO.Output(2, fmt.Sprintln(v...))
  134. }
  135. return
  136. }
  137. // Infof implement ILogger
  138. func (s *SimpleLogger) Infof(format string, v ...interface{}) {
  139. if s.level <= LOG_INFO {
  140. s.INFO.Output(2, fmt.Sprintf(format, v...))
  141. }
  142. return
  143. }
  144. // Warn implement ILogger
  145. func (s *SimpleLogger) Warn(v ...interface{}) {
  146. if s.level <= LOG_WARNING {
  147. s.WARN.Output(2, fmt.Sprintln(v...))
  148. }
  149. return
  150. }
  151. // Warnf implement ILogger
  152. func (s *SimpleLogger) Warnf(format string, v ...interface{}) {
  153. if s.level <= LOG_WARNING {
  154. s.WARN.Output(2, fmt.Sprintf(format, v...))
  155. }
  156. return
  157. }
  158. // Level implement ILogger
  159. func (s *SimpleLogger) Level() LogLevel {
  160. return s.level
  161. }
  162. // SetLevel implement ILogger
  163. func (s *SimpleLogger) SetLevel(l LogLevel) {
  164. s.level = l
  165. return
  166. }
  167. // ShowSQL implement ILogger
  168. func (s *SimpleLogger) ShowSQL(show ...bool) {
  169. if len(show) == 0 {
  170. s.showSQL = true
  171. return
  172. }
  173. s.showSQL = show[0]
  174. }
  175. // IsShowSQL implement ILogger
  176. func (s *SimpleLogger) IsShowSQL() bool {
  177. return s.showSQL
  178. }