Skip to content

Instantly share code, notes, and snippets.

@akhenakh
Created January 27, 2021 20:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akhenakh/4c16673954cd6a25b8611d4015f3396f to your computer and use it in GitHub Desktop.
Save akhenakh/4c16673954cd6a25b8611d4015f3396f to your computer and use it in GitHub Desktop.
kitlogadapter for pgx
package kitlogadapter
import (
"context"
"github.com/go-kit/kit/log"
kitlevel "github.com/go-kit/kit/log/level"
"github.com/jackc/pgx/v4"
)
type Logger struct {
l log.Logger
}
func NewLogger(l log.Logger) *Logger {
return &Logger{l: l}
}
func (l *Logger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) {
logger := l.l
for k, v := range data {
logger = log.With(logger, k, v)
}
switch level {
case pgx.LogLevelTrace:
logger.Log("PGX_LOG_LEVEL", level, "msg", msg)
case pgx.LogLevelDebug:
kitlevel.Debug(logger).Log("msg", msg)
case pgx.LogLevelInfo:
kitlevel.Info(logger).Log("msg", msg)
case pgx.LogLevelWarn:
kitlevel.Warn(logger).Log("msg", msg)
case pgx.LogLevelError:
kitlevel.Error(logger).Log("msg", msg)
default:
logger.Log("INVALID_PGX_LOG_LEVEL", level, "error", msg)
}
}
// Example to use the logger
package main
import (
"context"
"os"
"time"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/jackc/pgx/v4/log/kitlogadapter"
"github.com/jackc/pgx/v4/pgxpool"
)
func main() {
logger := log.NewJSONLogger(log.NewSyncWriter(os.Stdout))
logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.Caller(5))
logger = level.NewFilter(logger, level.AllowDebug())
pgxlogger := kitlogadapter.NewLogger(log.With(logger, "caller", log.Caller(5)))
poolConfig, err := pgxpool.ParseConfig(os.Getenv("DATABASE_URL"))
if err != nil {
level.Error(logger).Log("msg", "Unable to parse DATABASE_URL", "error", err)
os.Exit(1)
}
poolConfig.ConnConfig.Logger = pgxlogger
db, err := pgxpool.ConnectConfig(context.Background(), poolConfig)
if err != nil {
level.Error(logger).Log("msg", "Unable to create connection pool", "error", err)
os.Exit(1)
}
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
err = db.Ping(ctx)
if err != nil {
level.Error(logger).Log("msg", "Can't ping the DB", "error", err)
os.Exit(1)
}
level.Info(logger).Log("msg", "OK")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment