99 lines
1.9 KiB
Go
99 lines
1.9 KiB
Go
|
package pgx
|
||
|
|
||
|
import (
|
||
|
"encoding/hex"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
// 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(level LogLevel, msg string, data map[string]interface{})
|
||
|
}
|
||
|
|
||
|
// LogLevelFromString converts log level string to constant
|
||
|
//
|
||
|
// Valid levels:
|
||
|
// 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
|
||
|
}
|