ksql/logger.go

70 lines
1.3 KiB
Go

package ksql
import (
"context"
"encoding/json"
"fmt"
)
// This variable is only used during tests:
var logPrinter = fmt.Println
var _ LoggerFn = ErrorsLogger
func ErrorsLogger(ctx context.Context, values LogValues) {
if values.Err == nil {
return
}
Logger(ctx, values)
}
var _ LoggerFn = Logger
func Logger(ctx context.Context, values LogValues) {
m := map[string]interface{}{
"query": values.Query,
"params": values.Params,
}
if values.Err != nil {
m["error"] = values.Err.Error()
}
b, _ := json.Marshal(m)
logPrinter(string(b))
}
type loggerKey struct{}
type LogValues struct {
Query string
Params []interface{}
Err error
}
type LoggerFn func(ctx context.Context, values LogValues)
type loggerFn func(ctx context.Context, query string, params []interface{}, err error)
func InjectLogger(
ctx context.Context,
logFn LoggerFn,
) context.Context {
return context.WithValue(ctx, loggerKey{}, loggerFn(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
}
l.(loggerFn)(ctx, query, params, *err)
}