...
1
2 package zerologadapter
3
4 import (
5 "context"
6
7 "github.com/jackc/pgx/v4"
8 "github.com/rs/zerolog"
9 )
10
11 type Logger struct {
12 logger zerolog.Logger
13 withFunc func(context.Context, zerolog.Context) zerolog.Context
14 fromContext bool
15 skipModule bool
16 }
17
18
19 type option func(logger *Logger)
20
21
22
23 func WithContextFunc(withFunc func(context.Context, zerolog.Context) zerolog.Context) option {
24 return func(logger *Logger) {
25 logger.withFunc = withFunc
26 }
27 }
28
29
30 func WithoutPGXModule() option {
31 return func(logger *Logger) {
32 logger.skipModule = true
33 }
34 }
35
36
37
38 func NewLogger(logger zerolog.Logger, options ...option) *Logger {
39 l := Logger{
40 logger: logger,
41 }
42 l.init(options)
43 return &l
44 }
45
46
47
48
49 func NewContextLogger(options ...option) *Logger {
50 l := Logger{
51 fromContext: true,
52 }
53 l.init(options)
54 return &l
55 }
56
57 func (pl *Logger) init(options []option) {
58 for _, opt := range options {
59 opt(pl)
60 }
61 if !pl.skipModule {
62 pl.logger = pl.logger.With().Str("module", "pgx").Logger()
63 }
64 }
65
66 func (pl *Logger) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) {
67 var zlevel zerolog.Level
68 switch level {
69 case pgx.LogLevelNone:
70 zlevel = zerolog.NoLevel
71 case pgx.LogLevelError:
72 zlevel = zerolog.ErrorLevel
73 case pgx.LogLevelWarn:
74 zlevel = zerolog.WarnLevel
75 case pgx.LogLevelInfo:
76 zlevel = zerolog.InfoLevel
77 case pgx.LogLevelDebug:
78 zlevel = zerolog.DebugLevel
79 default:
80 zlevel = zerolog.DebugLevel
81 }
82
83 var zctx zerolog.Context
84 if pl.fromContext {
85 logger := zerolog.Ctx(ctx)
86 zctx = logger.With()
87 } else {
88 zctx = pl.logger.With()
89 }
90 if pl.withFunc != nil {
91 zctx = pl.withFunc(ctx, zctx)
92 }
93
94 pgxlog := zctx.Logger()
95 event := pgxlog.WithLevel(zlevel)
96 if event.Enabled() {
97 if pl.fromContext && !pl.skipModule {
98 event.Str("module", "pgx")
99 }
100 event.Fields(data).Msg(msg)
101 }
102 }
103
View as plain text