logger.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package muesli
  2. import (
  3. "fmt"
  4. "runtime"
  5. "strings"
  6. )
  7. /** Logger interface that Muesli uses,to allow external logging packages to be used easly.*/
  8. type Logger interface {
  9. Log(level string, file string, line int, format string, args ...interface{})
  10. }
  11. func WriteLog(logger Logger, depth int, level string, format string, args ...interface{}) {
  12. if logger == nil {
  13. return
  14. }
  15. _, file, line, ok := runtime.Caller(depth)
  16. if !ok {
  17. file = "unknown"
  18. line = 0
  19. }
  20. logger.Log(level, file, line, format, args...)
  21. }
  22. type LoggerWrapper struct {
  23. Logger
  24. }
  25. func (lw LoggerWrapper) WriteLog(depth int, level string, format string, args ...interface{}) {
  26. WriteLog(lw.Logger, depth, level, format, args...)
  27. }
  28. func (lw LoggerWrapper) LogDebug(format string, args ...interface{}) {
  29. lw.WriteLog(3, "DEBUG:", format, args...)
  30. }
  31. func (lw LoggerWrapper) LogInfo(format string, args ...interface{}) {
  32. lw.WriteLog(3, "INFO:", format, args...)
  33. }
  34. func (lw LoggerWrapper) LogWarning(format string, args ...interface{}) {
  35. lw.WriteLog(3, "WARNING:", format, args...)
  36. }
  37. func (lw LoggerWrapper) LogError(format string, args ...interface{}) {
  38. lw.WriteLog(3, "ERROR:", format, args...)
  39. }
  40. type testLogger struct {
  41. last string
  42. repeat int
  43. }
  44. func (tl *testLogger) Log(level string, file string, line int, format string, args ...interface{}) {
  45. text1 := fmt.Sprintf("%s:%s:%d: ", level, file, line)
  46. text2 := fmt.Sprintf(format, args...)
  47. if format[len(format)-1] != '\n' {
  48. text2 = text2 + "\n"
  49. }
  50. out := text1 + text2
  51. if strings.Compare(out, tl.last) == 0 {
  52. tl.repeat++
  53. } else {
  54. if tl.repeat > 0 {
  55. fmt.Printf("%s:%s:%d: Above message repeated %d times.",
  56. level, file, line, tl.repeat)
  57. }
  58. tl.last = out
  59. tl.repeat = 0
  60. fmt.Printf("%s", out)
  61. }
  62. }