func Extract(ctx context.Context) log.Logger {
	l, ok := ctx.Value(ctxMarkerKey).(*ctxLogger)
	if !ok || l == nil {
		return log.NewNopLogger()
	}
	fields := TagsToFields(ctx)
	return log.With(l.logger, append(fields, l.fields...)...)
}
Extract takes the call-scoped Logger from grpc_kit middleware.

It always returns a Logger that has all the grpc_ctxtags updated.
package ctxkit
import (
	"context"
	"github.com/go-kit/log"
	grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags"
)
type ctxMarker struct{}
type ctxLogger struct {
	logger log.Logger
	fields []interface{}
}
var (
	ctxMarkerKey = &ctxMarker{}
)
func AddFields(ctx context.Context, fields ...interface{}) {
	l, ok := ctx.Value(ctxMarkerKey).(*ctxLogger)
	if !ok || l == nil {
		return
	}
	l.fields = append(l.fields, fields...)
}