pkg/xcontext/logger/internal/extend_wrapper.go (71 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates.
//
// This source code is licensed under the MIT license found in the
// LICENSE file in the root directory of this source tree.
// Package internal of logger unifies different types of loggers into
// interfaces Logger. For example it allows to upgrade simple fmt.Printf
// to be a fully functional Logger. Therefore multiple wrappers are implemented
// here to provide different functions which could be missing in some loggers.
package internal
import (
"fmt"
)
var (
_ Logger = ExtendWrapper{}
)
// ExtendWrapper implements Logger based on MinimalLogger.
//
// Thus if you have only a MinimalLogger, you can extend it to a Logger
// using this wrapper.
//
// It is called ExtendWrapper because it actually implements
// only LoggerExtensions.
type ExtendWrapper struct {
MinimalLogger
Prefix string
CurLevel Level
}
// OriginalLogger implements LoggerExtensions.
func (l ExtendWrapper) OriginalLogger() interface{} {
if backend, _ := l.MinimalLogger.(interface{ OriginalLogger() interface{} }); backend != nil {
return backend.OriginalLogger()
}
return l.MinimalLogger
}
// WithField implements LoggerExtensions.
func (l ExtendWrapper) WithField(key string, value interface{}) Logger {
l.Prefix += fmt.Sprintf("%s = %v ", key, value)
return l
}
// WithFields implements LoggerExtensions.
func (l ExtendWrapper) WithFields(fields Fields) Logger {
for key, value := range fields {
l.Prefix += fmt.Sprintf("%s = %v ", key, value)
}
return l
}
// WithLevel implements LoggerExtensions.
func (l ExtendWrapper) WithLevel(level Level) Logger {
l.CurLevel = level
return l
}
// Level implements LoggerExtensions.
func (l ExtendWrapper) Level() Level {
return l.CurLevel
}
// Debugf implements MinimalLogger.
//
// It calls the backend ExtendWrapper.MinimalLogger.Debugf but also checks
// if the logging level is satisfied.
func (l ExtendWrapper) Debugf(format string, args ...interface{}) {
if l.CurLevel < LevelDebug {
return
}
l.MinimalLogger.Debugf("%s"+format, append([]interface{}{l.Prefix}, args...)...)
}
// Infof implements MinimalLogger.
//
// It calls the backend ExtendWrapper.MinimalLogger.Infof but also checks
// if the logging level is satisfied.
func (l ExtendWrapper) Infof(format string, args ...interface{}) {
if l.CurLevel < LevelInfo {
return
}
l.MinimalLogger.Infof("%s"+format, append([]interface{}{l.Prefix}, args...)...)
}
// Warnf implements MinimalLogger.
//
// It calls the backend ExtendWrapper.MinimalLogger.Warnf but also checks
// if the logging level is satisfied.
func (l ExtendWrapper) Warnf(format string, args ...interface{}) {
if l.CurLevel < LevelWarning {
return
}
l.MinimalLogger.Warnf("%s"+format, append([]interface{}{l.Prefix}, args...)...)
}
// Errorf implements MinimalLogger.
//
// It calls the backend ExtendWrapper.MinimalLogger.Errorf but also checks
// if the logging level is satisfied.
func (l ExtendWrapper) Errorf(format string, args ...interface{}) {
if l.CurLevel < LevelError {
return
}
l.MinimalLogger.Errorf("%s"+format, append([]interface{}{l.Prefix}, args...)...)
}
// Panicf implements MinimalLogger.
//
// It calls the backend ExtendWrapper.MinimalLogger.Panicf but also checks
// if the logging level is satisfied.
func (l ExtendWrapper) Panicf(format string, args ...interface{}) {
if l.CurLevel < LevelPanic {
return
}
l.MinimalLogger.Panicf("%s"+format, append([]interface{}{l.Prefix}, args...)...)
}
// Fatalf implements MinimalLogger.
//
// It calls the backend ExtendWrapper.MinimalLogger.Fatalf but also checks
// if the logging level is satisfied.
func (l ExtendWrapper) Fatalf(format string, args ...interface{}) {
if l.CurLevel < LevelFatal {
return
}
l.MinimalLogger.Fatalf("%s"+format, append([]interface{}{l.Prefix}, args...)...)
}