uber-go/zap

Leveled fields: Fields present only at certain log levels

Offen

#1.078 geöffnet am 05.04.2022

 (7 Kommentare) (13 Reaktionen) (0 zugewiesene Personen)Go (1.448 Forks)batch import
enhancementgood starter taskhelp wanted

Repository-Metriken

Stars
 (22.391 Sterne)
PR-Merge-Metriken
 (Keine gemergten PRs in 30 T)

Beschreibung

An issue that users sometimes have is this:

They have a log statement like the following,

logger.Info("processing request", zap.String("fromUser", fromUser))

They would like to include additional information in that log statement, but only if the debug level is enabled.

Currently, the options are:

  1. Copy paste the log statement
if debugLevel {
  logger.Info("processing request", zap.String("fromUser", fromUser), zap.Object("request", request))
} else {
  logger.Info("processing request", zap.String("fromUser", fromUser))
}
  1. Add another log statement
logger.Info("processing request", zap.String("fromUser", fromUser))
logger.Debug("processing request", zap.Object("request", request))
  1. custom helpers like the following:
func levelField(log *zap.Logger, lvl zap.Level, field zap.Field) zap.Field {
  if !log.Core().Enabled(lvl) { return zap.Skip() }
  return field
}
logger.Info("processing request",
  zap.String("fromUser", fromUser),
  levelField(logger, zap.DebugLevel, zap.Object("request", request)))

I think it might be valuable for Zap to natively provide some concept of "leveled fields"—fields present only at certain log levels—based on something like the levelField helper above.

I don't have an exact design in mind, but Zap-native support for something like this would likely be able to drop that extra log argument.

Contributor Guide