2
0
Files
pgx/log/zapadapter/adapter.go
T
Nicholas Wilson aafa04c156 Use zap.Any for handling interface{} -> zap.Field conversion
zap.Any falls back to zap.Reflect, but is better for this case, because
it first checks for the types that zap handles specially.  For example,
time.Duration, or error, which zap.Reflect will just treat as untyped
int64 or struct objects, but zap.Any is able to detect these types and
print them properly.
2021-07-06 20:18:16 -05:00

43 lines
1.0 KiB
Go

// Package zapadapter provides a logger that writes to a go.uber.org/zap.Logger.
package zapadapter
import (
"context"
"github.com/jackc/pgx/v4"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
type Logger struct {
logger *zap.Logger
}
func NewLogger(logger *zap.Logger) *Logger {
return &Logger{logger: logger.WithOptions(zap.AddCallerSkip(1))}
}
func (pl *Logger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) {
fields := make([]zapcore.Field, len(data))
i := 0
for k, v := range data {
fields[i] = zap.Any(k, v)
i++
}
switch level {
case pgx.LogLevelTrace:
pl.logger.Debug(msg, append(fields, zap.Stringer("PGX_LOG_LEVEL", level))...)
case pgx.LogLevelDebug:
pl.logger.Debug(msg, fields...)
case pgx.LogLevelInfo:
pl.logger.Info(msg, fields...)
case pgx.LogLevelWarn:
pl.logger.Warn(msg, fields...)
case pgx.LogLevelError:
pl.logger.Error(msg, fields...)
default:
pl.logger.Error(msg, append(fields, zap.Stringer("PGX_LOG_LEVEL", level))...)
}
}