package internal import ( "context" "k8s.io/klog/v2" ) // Logger defines the interface for logging operations. // The DefaultLogger must satisfy this interface. // This is necessary so we can store and retrieve the interface type in the context. type Logger interface { Debugf(format string, args ...interface{}) Infof(format string, args ...interface{}) Warnf(format string, args ...interface{}) Errorf(format string, args ...interface{}) } // Ensure DefaultLogger satisfies the Logger interface. var _ Logger = (*DefaultLogger)(nil) // DefaultLogger is enabled when no consuming clients provide // a logger to the server/cache subsystem. type DefaultLogger struct { } // NewDefaultLogger creates a DefaultLogger. func NewDefaultLogger() *DefaultLogger { // klog is globally initialized. You might call klog.InitFlags(nil) // and flag.Parse() earlier in your main function to configure it. // We don't do it here as it would conflict with other flag parsing. return &DefaultLogger{} } // Debugf logs a message at level debug. // klog's standard Verbosity (V) is used for debugging/info levels. // V(0) is typically equivalent to Infof, V(1) or higher is for debugging. func (l *DefaultLogger) Debugf(format string, args ...interface{}) { // Using V(2) for typical debug output klog.V(2).Infof(format, args...) } // Infof logs a message at level info. func (l *DefaultLogger) Infof(format string, args ...interface{}) { klog.Infof(format, args...) } // Warnf logs a message at level warn. func (l *DefaultLogger) Warnf(format string, args ...interface{}) { klog.Warningf(format, args...) } // Errorf logs a message at level error. func (l *DefaultLogger) Errorf(format string, args ...interface{}) { klog.Errorf(format, args...) } // ----------------------------------------------------------------------------- // Context Key and Functions // ----------------------------------------------------------------------------- // loggerKey is an unexported type for context keys. // Using an unexported, unique type prevents collisions with other packages' keys. type loggerKey struct{} var ( // defaultLog is a singleton instance of the default logger defaultLog = NewDefaultLogger() ) // WithLogger returns a new context derived from ctx with the provided Logger // injected into it. func WithLogger(ctx context.Context, log Logger) context.Context { return context.WithValue(ctx, loggerKey{}, log) } // LogFromContext extracts the Logger from the context. // If no Logger is present, it returns the default Logger. func LogFromContext(ctx context.Context) Logger { if ctx == nil { return defaultLog } // Retrieve the value stored with loggerKey{} if log, ok := ctx.Value(loggerKey{}).(Logger); ok { return log } // If no logger is found in the context, return the default logger return defaultLog }