This commit is contained in:
Max Ignatenko 2024-02-15 16:10:39 +00:00
parent 2b6abac607
commit 63a767d890
25 changed files with 3027 additions and 0 deletions

View file

@ -0,0 +1,97 @@
package gormzerolog
import (
"context"
"errors"
"time"
"github.com/rs/zerolog"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type logAdapter struct {
logger *zerolog.Logger
config logger.Config
}
// New returns a logger that will use zerolog to log messages.
// Both `config` and `logger` are optional. If `logger` is `nil`,
// it will be retrieved from context.Context. Config options that
// are configured in zerolog are not supported (currently that's
// `Colorful` and `LogLevel`).
func New(config *logger.Config, logger *zerolog.Logger) logger.Interface {
r := &logAdapter{logger: logger}
if config != nil {
r.config = *config
}
return r
}
func (l *logAdapter) ctx(ctx context.Context) *zerolog.Logger {
if l.logger != nil {
return l.logger
}
return zerolog.Ctx(ctx)
}
// Stuff below was copy-pasted from https://github.com/go-gorm/gorm/blob/v1.25.7/logger/logger.go
// and edited.
func (l *logAdapter) LogMode(level logger.LogLevel) logger.Interface {
return l
}
// Info print info
func (l *logAdapter) Info(ctx context.Context, msg string, data ...interface{}) {
l.ctx(ctx).Info().CallerSkipFrame(3).Msgf(msg, data...)
}
// Warn print warn messages
func (l *logAdapter) Warn(ctx context.Context, msg string, data ...interface{}) {
l.ctx(ctx).Warn().CallerSkipFrame(3).Msgf(msg, data...)
}
// Error print error messages
func (l *logAdapter) Error(ctx context.Context, msg string, data ...interface{}) {
l.ctx(ctx).Error().CallerSkipFrame(3).Msgf(msg, data...)
}
// Trace print sql message
//
//nolint:cyclop
func (l *logAdapter) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) {
elapsed := time.Since(begin)
sql, rows := fc()
switch {
case err != nil && (!errors.Is(err, gorm.ErrRecordNotFound) || !l.config.IgnoreRecordNotFoundError):
log := l.ctx(ctx).Error().CallerSkipFrame(3).Err(err)
if rows >= 0 {
log.Int64("rows", rows)
}
log.Dur("dur", elapsed)
log.Msgf("%s: %s", sql, err)
case elapsed > l.config.SlowThreshold && l.config.SlowThreshold != 0:
log := l.ctx(ctx).Warn().CallerSkipFrame(3)
if rows >= 0 {
log.Int64("rows", rows)
}
log.Dur("dur", elapsed)
log.Msgf("SLOW SQL: %s", sql)
default:
log := l.ctx(ctx).Trace().CallerSkipFrame(3)
if rows >= 0 {
log.Int64("rows", rows)
}
log.Dur("dur", elapsed)
log.Msgf("%s", sql)
}
}
// ParamsFilter filter params
func (l *logAdapter) ParamsFilter(ctx context.Context, sql string, params ...interface{}) (string, []interface{}) {
if l.config.ParameterizedQueries {
return sql, nil
}
return sql, params
}

52
util/resolver/resolver.go Normal file
View file

@ -0,0 +1,52 @@
package resolver
import (
"context"
"errors"
"os"
"github.com/bluesky-social/indigo/api"
"github.com/bluesky-social/indigo/did"
)
var Resolver did.Resolver
func init() {
resolver := did.NewMultiResolver()
plcAddr := os.Getenv("ATP_PLC_ADDR")
if plcAddr == "" {
plcAddr = "https://plc.directory"
}
resolver.AddHandler("plc", &fallbackResolver{
resolvers: []did.Resolver{
&api.PLCServer{Host: plcAddr},
&api.PLCServer{Host: "https://plc.directory"},
}})
resolver.AddHandler("web", &did.WebResolver{})
Resolver = resolver
}
func GetDocument(ctx context.Context, didstr string) (*did.Document, error) {
return Resolver.GetDocument(ctx, didstr)
}
type fallbackResolver struct {
resolvers []did.Resolver
}
func (r *fallbackResolver) GetDocument(ctx context.Context, didstr string) (*did.Document, error) {
errs := []error{}
for _, res := range r.resolvers {
if d, err := res.GetDocument(ctx, didstr); err == nil {
return d, nil
}
}
return nil, errors.Join(errs...)
}
func (r *fallbackResolver) FlushCacheFor(did string) {
for _, res := range r.resolvers {
res.FlushCacheFor(did)
}
}