log.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package log
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "time"
  7. "github.com/rs/zerolog"
  8. "github.com/rs/zerolog/log"
  9. "github.com/spf13/viper"
  10. )
  11. // TODO for deduped functions, if timeLogged > logTypeLimit, should we log once
  12. // every... 100 (?) times so we don't lose track entirely?
  13. // concurrency-safe counter
  14. var ctr = newCounter()
  15. func InitLogging() {
  16. zerolog.TimeFieldFormat = time.RFC3339Nano
  17. // Default to using pretty formatting
  18. if strings.ToLower(viper.GetString("log-format")) != "json" {
  19. disableColor := viper.GetBool("disable-log-color")
  20. log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339Nano, NoColor: disableColor})
  21. }
  22. level, err := zerolog.ParseLevel(viper.GetString("log-level"))
  23. if err != nil {
  24. zerolog.SetGlobalLevel(zerolog.InfoLevel)
  25. log.Warn().Msg("Error parsing log-level, setting level to 'info'")
  26. return
  27. }
  28. zerolog.SetGlobalLevel(level)
  29. log.Log().Msgf("Log level set to %v", level)
  30. }
  31. func Errorf(format string, a ...interface{}) {
  32. log.Error().Msgf(format, a...)
  33. }
  34. func DedupedErrorf(logTypeLimit int, format string, a ...interface{}) {
  35. timesLogged := ctr.increment(format)
  36. if timesLogged < logTypeLimit {
  37. Errorf(format, a...)
  38. } else if timesLogged == logTypeLimit {
  39. Errorf(format, a...)
  40. Infof("%s logged %d times: suppressing future logs", format, logTypeLimit)
  41. }
  42. }
  43. func Warnf(format string, a ...interface{}) {
  44. log.Warn().Msgf(format, a...)
  45. }
  46. func DedupedWarningf(logTypeLimit int, format string, a ...interface{}) {
  47. timesLogged := ctr.increment(format)
  48. if timesLogged < logTypeLimit {
  49. Warnf(format, a...)
  50. } else if timesLogged == logTypeLimit {
  51. Warnf(format, a...)
  52. Infof("%s logged %d times: suppressing future logs", format, logTypeLimit)
  53. }
  54. }
  55. func Info(msg string) {
  56. log.Info().Msg(msg)
  57. }
  58. func Infof(format string, a ...interface{}) {
  59. log.Info().Msgf(format, a...)
  60. }
  61. func DedupedInfof(logTypeLimit int, format string, a ...interface{}) {
  62. timesLogged := ctr.increment(format)
  63. if timesLogged < logTypeLimit {
  64. Infof(format, a...)
  65. } else if timesLogged == logTypeLimit {
  66. Infof(format, a...)
  67. Infof("%s logged %d times: suppressing future logs", format, logTypeLimit)
  68. }
  69. }
  70. func Profilef(format string, a ...interface{}) {
  71. log.Info().Msgf(fmt.Sprintf("[Profiler] %s", format), a...)
  72. }
  73. func Debug(msg string) {
  74. log.Debug().Msg(msg)
  75. }
  76. func Debugf(format string, a ...interface{}) {
  77. log.Debug().Msgf(format, a...)
  78. }
  79. func Fatalf(format string, a ...interface{}) {
  80. log.Fatal().Msgf(format, a...)
  81. }
  82. func Profile(start time.Time, name string) {
  83. elapsed := time.Since(start)
  84. Profilef("%s: %s", elapsed, name)
  85. }
  86. func ProfileWithThreshold(start time.Time, threshold time.Duration, name string) {
  87. elapsed := time.Since(start)
  88. if elapsed > threshold {
  89. Profilef("%s: %s", elapsed, name)
  90. }
  91. }