ksql/logger.go

64 lines
1.2 KiB
Go

package ksql
import "context"
type loggerKey struct{}
type LogValues struct {
Query string
Params []interface{}
Err error
}
func InjectLogger(
ctx context.Context,
level string,
logFn func(ctx context.Context, values LogValues),
) context.Context {
if level != "info" {
level = "error"
}
return context.WithValue(ctx, loggerKey{}, logger{
level: level,
logFn: func(ctx context.Context, query string, params []interface{}, err error) {
logFn(ctx, LogValues{
Query: query,
Params: params,
Err: err,
})
},
})
}
func ctxLog(ctx context.Context, query string, params []interface{}, err *error) {
l := ctx.Value(loggerKey{})
if l == nil {
return
}
if *err != nil {
l.(logger)._error(ctx, query, params, *err)
return
}
l.(logger)._info(ctx, query, params, nil)
}
type logger struct {
level string
logFn func(ctx context.Context, query string, params []interface{}, err error)
}
func (l logger) _info(ctx context.Context, query string, params []interface{}, err error) {
if l.level == "error" {
return
}
l.logFn(ctx, query, params, err)
}
func (l logger) _error(ctx context.Context, query string, params []interface{}, err error) {
l.logFn(ctx, query, params, err)
}