| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- package log
- import (
- "fmt"
- "os"
- "strings"
- "time"
- "github.com/rs/zerolog"
- "github.com/rs/zerolog/log"
- "github.com/spf13/pflag"
- "github.com/spf13/viper"
- )
- // TODO for deduped functions, if timeLogged > logTypeLimit, should we log once
- // every... 100 (?) times so we don't lose track entirely?
- // concurrency-safe counter
- var ctr = newCounter()
- const (
- flagFormat = "log-format"
- flagLevel = "log-level"
- flagDisableColor = "disable-log-color"
- )
- // InitLoggingFromFlags maps pflags (e.g. from a cobra command) representing
- // log level, format, and disable color to this logging package's expected
- // format in order to correctly initialize the logger. Passing a nil flag is
- // acceptable and will result in default behavior for that option.
- func InitLoggingFromFlags(level *pflag.Flag, format *pflag.Flag, disableColor *pflag.Flag) {
- viper.BindPFlag(flagLevel, level)
- viper.BindPFlag(flagFormat, format)
- viper.BindPFlag(flagDisableColor, disableColor)
- InitLogging()
- }
- func InitLogging() {
- zerolog.TimeFieldFormat = time.RFC3339Nano
- // Default to using pretty formatting
- if strings.ToLower(viper.GetString(flagFormat)) != "json" {
- disableColor := viper.GetBool(flagDisableColor)
- log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339Nano, NoColor: disableColor})
- }
- level, err := zerolog.ParseLevel(viper.GetString(flagLevel))
- if err != nil {
- zerolog.SetGlobalLevel(zerolog.InfoLevel)
- log.Warn().Msg("Error parsing log-level, setting level to 'info'")
- return
- }
- zerolog.SetGlobalLevel(level)
- log.Log().Msgf("Log level set to %v", level)
- }
- func Errorf(format string, a ...interface{}) {
- log.Error().Msgf(format, a...)
- }
- func DedupedErrorf(logTypeLimit int, format string, a ...interface{}) {
- timesLogged := ctr.increment(format)
- if timesLogged < logTypeLimit {
- Errorf(format, a...)
- } else if timesLogged == logTypeLimit {
- Errorf(format, a...)
- Infof("%s logged %d times: suppressing future logs", format, logTypeLimit)
- }
- }
- func Warnf(format string, a ...interface{}) {
- log.Warn().Msgf(format, a...)
- }
- func DedupedWarningf(logTypeLimit int, format string, a ...interface{}) {
- timesLogged := ctr.increment(format)
- if timesLogged < logTypeLimit {
- Warnf(format, a...)
- } else if timesLogged == logTypeLimit {
- Warnf(format, a...)
- Infof("%s logged %d times: suppressing future logs", format, logTypeLimit)
- }
- }
- func Info(msg string) {
- log.Info().Msg(msg)
- }
- func Infof(format string, a ...interface{}) {
- log.Info().Msgf(format, a...)
- }
- func DedupedInfof(logTypeLimit int, format string, a ...interface{}) {
- timesLogged := ctr.increment(format)
- if timesLogged < logTypeLimit {
- Infof(format, a...)
- } else if timesLogged == logTypeLimit {
- Infof(format, a...)
- Infof("%s logged %d times: suppressing future logs", format, logTypeLimit)
- }
- }
- func Profilef(format string, a ...interface{}) {
- log.Info().Msgf(fmt.Sprintf("[Profiler] %s", format), a...)
- }
- func Debug(msg string) {
- log.Debug().Msg(msg)
- }
- func Debugf(format string, a ...interface{}) {
- log.Debug().Msgf(format, a...)
- }
- func Fatalf(format string, a ...interface{}) {
- log.Fatal().Msgf(format, a...)
- }
- func Profile(start time.Time, name string) {
- elapsed := time.Since(start)
- Profilef("%s: %s", elapsed, name)
- }
- func ProfileWithThreshold(start time.Time, threshold time.Duration, name string) {
- elapsed := time.Since(start)
- if elapsed > threshold {
- Profilef("%s: %s", elapsed, name)
- }
- }
|