mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-23 08:56:31 +01:00
5b7e8d1309
* lib/backup/s3remote: update AWS SDK to v2 * Update lib/backup/s3remote/s3.go Co-authored-by: Aliaksandr Valialkin <valyala@victoriametrics.com> * lib/backup/s3remote: refactor error handling Co-authored-by: Aliaksandr Valialkin <valyala@victoriametrics.com>
83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
package logging
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"log"
|
|
)
|
|
|
|
// Classification is the type of the log entry's classification name.
|
|
type Classification string
|
|
|
|
// Set of standard classifications that can be used by clients and middleware
|
|
const (
|
|
Warn Classification = "WARN"
|
|
Debug Classification = "DEBUG"
|
|
)
|
|
|
|
// Logger is an interface for logging entries at certain classifications.
|
|
type Logger interface {
|
|
// Logf is expected to support the standard fmt package "verbs".
|
|
Logf(classification Classification, format string, v ...interface{})
|
|
}
|
|
|
|
// LoggerFunc is a wrapper around a function to satisfy the Logger interface.
|
|
type LoggerFunc func(classification Classification, format string, v ...interface{})
|
|
|
|
// Logf delegates the logging request to the wrapped function.
|
|
func (f LoggerFunc) Logf(classification Classification, format string, v ...interface{}) {
|
|
f(classification, format, v...)
|
|
}
|
|
|
|
// ContextLogger is an optional interface a Logger implementation may expose that provides
|
|
// the ability to create context aware log entries.
|
|
type ContextLogger interface {
|
|
WithContext(context.Context) Logger
|
|
}
|
|
|
|
// WithContext will pass the provided context to logger if it implements the ContextLogger interface and return the resulting
|
|
// logger. Otherwise the logger will be returned as is. As a special case if a nil logger is provided, a Nop logger will
|
|
// be returned to the caller.
|
|
func WithContext(ctx context.Context, logger Logger) Logger {
|
|
if logger == nil {
|
|
return Nop{}
|
|
}
|
|
|
|
cl, ok := logger.(ContextLogger)
|
|
if !ok {
|
|
return logger
|
|
}
|
|
|
|
return cl.WithContext(ctx)
|
|
}
|
|
|
|
// Nop is a Logger implementation that simply does not perform any logging.
|
|
type Nop struct{}
|
|
|
|
// Logf simply returns without performing any action
|
|
func (n Nop) Logf(Classification, string, ...interface{}) {
|
|
return
|
|
}
|
|
|
|
// StandardLogger is a Logger implementation that wraps the standard library logger, and delegates logging to it's
|
|
// Printf method.
|
|
type StandardLogger struct {
|
|
Logger *log.Logger
|
|
}
|
|
|
|
// Logf logs the given classification and message to the underlying logger.
|
|
func (s StandardLogger) Logf(classification Classification, format string, v ...interface{}) {
|
|
if len(classification) != 0 {
|
|
format = string(classification) + " " + format
|
|
}
|
|
|
|
s.Logger.Printf(format, v...)
|
|
}
|
|
|
|
// NewStandardLogger returns a new StandardLogger
|
|
func NewStandardLogger(writer io.Writer) *StandardLogger {
|
|
return &StandardLogger{
|
|
Logger: log.New(writer, "SDK ", log.LstdFlags),
|
|
}
|
|
}
|