1
0
mirror of https://github.com/redis/go-redis.git synced 2025-09-05 20:24:00 +03:00
Files
go-redis/logging/logging.go
2025-08-29 22:44:00 +03:00

122 lines
3.3 KiB
Go

// Package logging provides logging level constants and utilities for the go-redis library.
// This package centralizes logging configuration to ensure consistency across all components.
package logging
import (
"context"
"fmt"
"strings"
"github.com/redis/go-redis/v9/internal"
)
// LogLevel represents the logging level
type LogLevel int
// Log level constants for the entire go-redis library
const (
LogLevelError LogLevel = iota // 0 - errors only
LogLevelWarn // 1 - warnings and errors
LogLevelInfo // 2 - info, warnings, and errors
LogLevelDebug // 3 - debug, info, warnings, and errors
)
// String returns the string representation of the log level
func (l LogLevel) String() string {
switch l {
case LogLevelError:
return "ERROR"
case LogLevelWarn:
return "WARN"
case LogLevelInfo:
return "INFO"
case LogLevelDebug:
return "DEBUG"
default:
return "UNKNOWN"
}
}
// IsValid returns true if the log level is valid
func (l LogLevel) IsValid() bool {
return l >= LogLevelError && l <= LogLevelDebug
}
func (l LogLevel) WarnOrAbove() bool {
return l >= LogLevelWarn
}
func (l LogLevel) InfoOrAbove() bool {
return l >= LogLevelInfo
}
func (l LogLevel) DebugOrAbove() bool {
return l >= LogLevelDebug
}
// VoidLogger is a logger that does nothing.
// Used to disable logging and thus speed up the library.
type VoidLogger struct{}
func (v *VoidLogger) Printf(_ context.Context, _ string, _ ...interface{}) {
// do nothing
}
// Disable disables logging by setting the internal logger to a void logger.
// This can be used to speed up the library if logging is not needed.
// It will override any custom logger that was set before and set the VoidLogger.
func Disable() {
internal.Logger = &VoidLogger{}
}
// Enable enables logging by setting the internal logger to the default logger.
// This is the default behavior.
// You can use redis.SetLogger to set a custom logger.
//
// NOTE: This function is not thread-safe.
// It will override any custom logger that was set before and set the DefaultLogger.
func Enable() {
internal.Logger = internal.NewDefaultLogger()
}
// NewBlacklistLogger returns a new logger that filters out messages containing any of the substrings.
// This can be used to filter out messages containing sensitive information.
func NewBlacklistLogger(substr []string) internal.Logging {
l := internal.NewDefaultLogger()
return &filterLogger{logger: l, substr: substr, blacklist: true}
}
// NewWhitelistLogger returns a new logger that only logs messages containing any of the substrings.
// This can be used to only log messages related to specific commands or patterns.
func NewWhitelistLogger(substr []string) internal.Logging {
l := internal.NewDefaultLogger()
return &filterLogger{logger: l, substr: substr, blacklist: false}
}
type filterLogger struct {
logger internal.Logging
blacklist bool
substr []string
}
func (l *filterLogger) Printf(ctx context.Context, format string, v ...interface{}) {
msg := fmt.Sprintf(format, v...)
found := false
for _, substr := range l.substr {
if strings.Contains(msg, substr) {
found = true
if l.blacklist {
return
}
}
}
// whitelist, only log if one of the substrings is present
if !l.blacklist && !found {
return
}
if l.logger != nil {
l.logger.Printf(ctx, format, v...)
return
}
}