Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make logger configurable in the embedded ferretdb package #4028

Merged
merged 7 commits into from Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
47 changes: 30 additions & 17 deletions ferretdb/ferretdb.go
Expand Up @@ -23,6 +23,7 @@
"errors"
"fmt"
"net/url"
"sync"

"go.uber.org/zap"

Expand All @@ -38,6 +39,9 @@
type Config struct {
Listener ListenerConfig

// Logger to use; if nil, it uses the default global logger.
Logger *zap.Logger

// Handler to use; one of `postgresql` or `sqlite`.
Handler string

Expand Down Expand Up @@ -113,8 +117,15 @@

metrics := connmetrics.NewListenerMetrics()

log := config.Logger
if log == nil {
log = getGlobalLogger()
} else {
log = logging.WithHooks(log)

Check warning on line 124 in ferretdb/ferretdb.go

View check run for this annotation

Codecov / codecov/patch

ferretdb/ferretdb.go#L124

Added line #L124 was not covered by tests
}

h, closeBackend, err := registry.NewHandler(config.Handler, &registry.NewHandlerOpts{
Logger: logger,
Logger: log,
ConnMetrics: metrics.ConnMetrics,
StateProvider: sp,
TCPHost: config.Listener.TCP,
Expand Down Expand Up @@ -143,7 +154,7 @@
Mode: clientconn.NormalMode,
Metrics: metrics,
Handler: h,
Logger: logger,
Logger: log,
})

return &FerretDB{
Expand Down Expand Up @@ -214,21 +225,23 @@
return u.String()
}

// logger is a global logger used by FerretDB.
//
// TODO https://github.com/FerretDB/FerretDB/issues/4014
var logger *zap.Logger
var (
loggerOnce sync.Once
logger *zap.Logger
)

// Initialize the global logger there to avoid creating too many issues for zap users that initialize it in their
// `main()` functions. It is still not a full solution; eventually, we should remove the usage of the global logger.
//
// TODO https://github.com/FerretDB/FerretDB/issues/4014
func init() {
l := zap.ErrorLevel
if version.Get().DebugBuild {
l = zap.DebugLevel
}
// getGlobalLogger retrieves or creates a global logger using
// a loggerOnce to ensure it is created only once.
func getGlobalLogger() *zap.Logger {
fadyat marked this conversation as resolved.
Show resolved Hide resolved
loggerOnce.Do(func() {
level := zap.ErrorLevel
if version.Get().DebugBuild {
level = zap.DebugLevel
}

logging.Setup(level, "console", "")
noisersup marked this conversation as resolved.
Show resolved Hide resolved
logger = zap.L()
})

logging.Setup(l, "console", "")
logger = zap.L()
return logger
}
2 changes: 2 additions & 0 deletions internal/bson2/slog.go
Expand Up @@ -41,6 +41,7 @@ func slogValue(v any) slog.Value {
if v == nil {
return slog.StringValue("RawDocument(nil)")
}

return slog.StringValue("RawDocument(" + strconv.Itoa(len(v)) + " bytes)")

case *Array:
Expand All @@ -56,6 +57,7 @@ func slogValue(v any) slog.Value {
if v == nil {
return slog.StringValue("RawArray(nil)")
}

return slog.StringValue("RawArray(" + strconv.Itoa(len(v)) + " bytes)")

default:
Expand Down
9 changes: 6 additions & 3 deletions internal/util/logging/logging.go
Expand Up @@ -80,12 +80,15 @@ func Setup(level zapcore.Level, encoding, uuid string) {
log.Fatal(err)
}

logger = logger.WithOptions(zap.Hooks(func(entry zapcore.Entry) error {
SetupWithZapLogger(WithHooks(logger))
}

// WithHooks returns a logger with recent entries hooks.
func WithHooks(logger *zap.Logger) *zap.Logger {
return logger.WithOptions(zap.Hooks(func(entry zapcore.Entry) error {
RecentEntries.append(&entry)
return nil
}))

SetupWithZapLogger(logger)
}

// setupSlog initializes slog logging with a given level.
Expand Down