client/internal/http/log.go (40 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package http
import (
"github.com/hashicorp/go-retryablehttp"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var _ retryablehttp.LeveledLogger = (*leveledLoggerShim)(nil)
// leveledLoggerShim provides an implementation of retryablehttp.LeveledLogger, shimming into a zap.Logger.
type leveledLoggerShim struct {
logger *zap.Logger
}
func (l *leveledLoggerShim) Debug(msg string, keysAndValues ...interface{}) {
l.logger.Debug(msg, getZapFields(keysAndValues)...)
}
func (l *leveledLoggerShim) Error(msg string, keysAndValues ...interface{}) {
l.logger.Error(msg, getZapFields(keysAndValues)...)
}
func (l *leveledLoggerShim) Info(msg string, keysAndValues ...interface{}) {
l.logger.Info(msg, getZapFields(keysAndValues)...)
}
func (l *leveledLoggerShim) Warn(msg string, keysAndValues ...interface{}) {
l.logger.Warn(msg, getZapFields(keysAndValues)...)
}
func getZapFields(keysAndValues []interface{}) []zap.Field {
var fields []zap.Field
failed := len(keysAndValues)%2 != 0
for i := 0; i < len(keysAndValues)-1 && !failed; i += 2 {
key, ok := keysAndValues[i].(string)
if !ok || i+1 >= len(keysAndValues) {
failed = true
break
}
fields = append(fields, zap.Any(key, keysAndValues[i+1]))
}
if failed {
fields = []zapcore.Field{
zap.Any("leveled_logger_fields", keysAndValues),
}
}
return fields
}