2021-08-25 14:34:33 +01:00
|
|
|
package pgx
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"encoding/hex"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
// The values for log levels are chosen such that the zero value means that no
|
|
|
|
// log level was specified.
|
|
|
|
const (
|
|
|
|
LogLevelTrace = 6
|
|
|
|
LogLevelDebug = 5
|
|
|
|
LogLevelInfo = 4
|
|
|
|
LogLevelWarn = 3
|
|
|
|
LogLevelError = 2
|
|
|
|
LogLevelNone = 1
|
|
|
|
)
|
|
|
|
|
|
|
|
// LogLevel represents the pgx logging level. See LogLevel* constants for
|
|
|
|
// possible values.
|
|
|
|
type LogLevel int
|
|
|
|
|
|
|
|
func (ll LogLevel) String() string {
|
|
|
|
switch ll {
|
|
|
|
case LogLevelTrace:
|
|
|
|
return "trace"
|
|
|
|
case LogLevelDebug:
|
|
|
|
return "debug"
|
|
|
|
case LogLevelInfo:
|
|
|
|
return "info"
|
|
|
|
case LogLevelWarn:
|
|
|
|
return "warn"
|
|
|
|
case LogLevelError:
|
|
|
|
return "error"
|
|
|
|
case LogLevelNone:
|
|
|
|
return "none"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("invalid level %d", ll)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Logger is the interface used to get logging from pgx internals.
|
|
|
|
type Logger interface {
|
|
|
|
// Log a message at the given level with data key/value pairs. data may be nil.
|
|
|
|
Log(ctx context.Context, level LogLevel, msg string, data map[string]interface{})
|
|
|
|
}
|
|
|
|
|
2022-09-28 18:30:40 +01:00
|
|
|
// LoggerFunc is a wrapper around a function to satisfy the pgx.Logger interface
|
|
|
|
type LoggerFunc func(ctx context.Context, level LogLevel, msg string, data map[string]interface{})
|
|
|
|
|
|
|
|
// Log delegates the logging request to the wrapped function
|
|
|
|
func (f LoggerFunc) Log(ctx context.Context, level LogLevel, msg string, data map[string]interface{}) {
|
|
|
|
f(ctx, level, msg, data)
|
|
|
|
}
|
|
|
|
|
2021-08-25 14:34:33 +01:00
|
|
|
// LogLevelFromString converts log level string to constant
|
|
|
|
//
|
|
|
|
// Valid levels:
|
2022-09-28 18:30:40 +01:00
|
|
|
//
|
2021-08-25 14:34:33 +01:00
|
|
|
// trace
|
|
|
|
// debug
|
|
|
|
// info
|
|
|
|
// warn
|
|
|
|
// error
|
|
|
|
// none
|
|
|
|
func LogLevelFromString(s string) (LogLevel, error) {
|
|
|
|
switch s {
|
|
|
|
case "trace":
|
|
|
|
return LogLevelTrace, nil
|
|
|
|
case "debug":
|
|
|
|
return LogLevelDebug, nil
|
|
|
|
case "info":
|
|
|
|
return LogLevelInfo, nil
|
|
|
|
case "warn":
|
|
|
|
return LogLevelWarn, nil
|
|
|
|
case "error":
|
|
|
|
return LogLevelError, nil
|
|
|
|
case "none":
|
|
|
|
return LogLevelNone, nil
|
|
|
|
default:
|
|
|
|
return 0, errors.New("invalid log level")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func logQueryArgs(args []interface{}) []interface{} {
|
|
|
|
logArgs := make([]interface{}, 0, len(args))
|
|
|
|
|
|
|
|
for _, a := range args {
|
|
|
|
switch v := a.(type) {
|
|
|
|
case []byte:
|
|
|
|
if len(v) < 64 {
|
|
|
|
a = hex.EncodeToString(v)
|
|
|
|
} else {
|
|
|
|
a = fmt.Sprintf("%x (truncated %d bytes)", v[:64], len(v)-64)
|
|
|
|
}
|
|
|
|
case string:
|
|
|
|
if len(v) > 64 {
|
|
|
|
a = fmt.Sprintf("%s (truncated %d bytes)", v[:64], len(v)-64)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
logArgs = append(logArgs, a)
|
|
|
|
}
|
|
|
|
|
|
|
|
return logArgs
|
|
|
|
}
|