...

Source file src/github.com/jackc/pgx/v4/log/zerologadapter/adapter.go

Documentation: github.com/jackc/pgx/v4/log/zerologadapter

     1  // Package zerologadapter provides a logger that writes to a github.com/rs/zerolog.
     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  // option options for configuring the logger when creating a new logger.
    19  type option func(logger *Logger)
    20  
    21  // WithContextFunc adds possibility to get request scoped values from the
    22  // ctx.Context before logging lines.
    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  // WithoutPGXModule disables adding module:pgx to the default logger context.
    30  func WithoutPGXModule() option {
    31  	return func(logger *Logger) {
    32  		logger.skipModule = true
    33  	}
    34  }
    35  
    36  // NewLogger accepts a zerolog.Logger as input and returns a new custom pgx
    37  // logging facade as output.
    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  // NewContextLogger creates logger that extracts the zerolog.Logger from the
    47  // context.Context by using `zerolog.Ctx`. The zerolog.DefaultContextLogger will
    48  // be used if no logger is associated with the context.
    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