diff --git a/bench_test.go b/bench_test.go index 69d17c39..91c73293 100644 --- a/bench_test.go +++ b/bench_test.go @@ -179,7 +179,7 @@ func BenchmarkSelectWithoutLogging(b *testing.B) { type discardLogger struct{} -func (dl discardLogger) Log(level int, msg string, ctx ...interface{}) {} +func (dl discardLogger) Log(level pgx.LogLevel, msg string, ctx ...interface{}) {} func BenchmarkSelectWithLoggingTraceDiscard(b *testing.B) { conn := mustConnect(b, *defaultConnConfig) diff --git a/conn.go b/conn.go index 7487b8ad..81a38df9 100644 --- a/conn.go +++ b/conn.go @@ -1213,7 +1213,7 @@ func (c *Conn) shouldLog(lvl int) bool { return c.logger != nil && c.logLevel >= lvl } -func (c *Conn) log(lvl int, msg string, ctx ...interface{}) { +func (c *Conn) log(lvl LogLevel, msg string, ctx ...interface{}) { if c.pid != 0 { ctx = append(ctx, "pid", c.PID) } diff --git a/conn_test.go b/conn_test.go index d4ca593f..8f47d995 100644 --- a/conn_test.go +++ b/conn_test.go @@ -1739,7 +1739,7 @@ func TestCatchSimultaneousConnectionQueryAndExec(t *testing.T) { } type testLog struct { - lvl int + lvl pgx.LogLevel msg string ctx []interface{} } @@ -1748,7 +1748,7 @@ type testLogger struct { logs []testLog } -func (l *testLogger) Log(level int, msg string, ctx ...interface{}) { +func (l *testLogger) Log(level pgx.LogLevel, msg string, ctx ...interface{}) { l.logs = append(l.logs, testLog{lvl: level, msg: msg, ctx: ctx}) } diff --git a/examples/url_shortener/main.go b/examples/url_shortener/main.go index 25e4cb90..8380ef3f 100644 --- a/examples/url_shortener/main.go +++ b/examples/url_shortener/main.go @@ -1,11 +1,13 @@ package main import ( - "github.com/jackc/pgx" - log "gopkg.in/inconshreveable/log15.v2" "io/ioutil" "net/http" "os" + + "github.com/jackc/pgx" + "github.com/jackc/pgx/log/log15adapter" + log "gopkg.in/inconshreveable/log15.v2" ) var pool *pgx.ConnPool @@ -98,27 +100,8 @@ func urlHandler(w http.ResponseWriter, req *http.Request) { } } -type log15Adapter struct { - logger log.Logger -} - -func (a *log15Adapter) Log(level int, msg string, ctx ...interface{}) { - switch level { - case pgx.LogLevelTrace, pgx.LogLevelDebug: - a.logger.Debug(msg, ctx...) - case pgx.LogLevelInfo: - a.logger.Info(msg, ctx...) - case pgx.LogLevelWarn: - a.logger.Warn(msg, ctx...) - case pgx.LogLevelError: - a.logger.Error(msg, ctx...) - default: - panic("invalid log level") - } -} - func main() { - logger := &log15Adapter{logger: log.New("module", "pgx")} + logger := log15adapter.NewLogger(log.New("module", "pgx")) var err error connPoolConfig := pgx.ConnPoolConfig{ diff --git a/log/log15adapter/adapter.go b/log/log15adapter/adapter.go new file mode 100644 index 00000000..55d1b79f --- /dev/null +++ b/log/log15adapter/adapter.go @@ -0,0 +1,42 @@ +// Package log15adapter provides a logger that writes to a github.com/inconshreveable/log15.Logger +// log. +package log15adapter + +import ( + "github.com/jackc/pgx" +) + +// Log15Logger interface defines the subset of +// github.com/inconshreveable/log15.Logger that this adapter uses. +type Log15Logger interface { + Debug(msg string, ctx ...interface{}) + Info(msg string, ctx ...interface{}) + Warn(msg string, ctx ...interface{}) + Error(msg string, ctx ...interface{}) + Crit(msg string, ctx ...interface{}) +} + +type Logger struct { + l Log15Logger +} + +func NewLogger(l Log15Logger) *Logger { + return &Logger{l: l} +} + +func (l *Logger) Log(level pgx.LogLevel, msg string, ctx ...interface{}) { + switch level { + case pgx.LogLevelTrace: + l.l.Debug(msg, append(ctx, "PGX_LOG_LEVEL", level)...) + case pgx.LogLevelDebug: + l.l.Debug(msg, ctx...) + case pgx.LogLevelInfo: + l.l.Info(msg, ctx...) + case pgx.LogLevelWarn: + l.l.Warn(msg, ctx...) + case pgx.LogLevelError: + l.l.Error(msg, ctx...) + default: + l.l.Error(msg, append(ctx, "INVALID_PGX_LOG_LEVEL", level)...) + } +} diff --git a/log/testingadapter/adapter.go b/log/testingadapter/adapter.go new file mode 100644 index 00000000..f042c4f1 --- /dev/null +++ b/log/testingadapter/adapter.go @@ -0,0 +1,25 @@ +// Package testingadapter provides a logger that writes to a test or benchmark +// log. +package testingadapter + +import ( + "github.com/jackc/pgx" +) + +// TestingLogger interface defines the subset of testing.TB methods used by this +// adapter. +type TestingLogger interface { + Log(args ...interface{}) +} + +type Logger struct { + l TestingLogger +} + +func NewLogger(l TestingLogger) *Logger { + return &Logger{l: l} +} + +func (l *Logger) Log(level pgx.LogLevel, msg string, ctx ...interface{}) { + l.l.Log(level, msg, ctx) +} diff --git a/logger.go b/logger.go index e4d28fed..f1b85322 100644 --- a/logger.go +++ b/logger.go @@ -17,10 +17,33 @@ const ( 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 context key/value pairs - Log(level int, msg string, ctx ...interface{}) + Log(level LogLevel, msg string, ctx ...interface{}) } // LogLevelFromString converts log level string to constant @@ -32,7 +55,7 @@ type Logger interface { // warn // error // none -func LogLevelFromString(s string) (int, error) { +func LogLevelFromString(s string) (LogLevel, error) { switch s { case "trace": return LogLevelTrace, nil diff --git a/stdlib/sql_test.go b/stdlib/sql_test.go index 641ba9fe..dadafd41 100644 --- a/stdlib/sql_test.go +++ b/stdlib/sql_test.go @@ -365,7 +365,7 @@ func TestConnQuery(t *testing.T) { } type testLog struct { - lvl int + lvl pgx.LogLevel msg string ctx []interface{} } @@ -374,7 +374,7 @@ type testLogger struct { logs []testLog } -func (l *testLogger) Log(lvl int, msg string, ctx ...interface{}) { +func (l *testLogger) Log(lvl pgx.LogLevel, msg string, ctx ...interface{}) { l.logs = append(l.logs, testLog{lvl: lvl, msg: msg, ctx: ctx}) }