Thanks for the help, for now I’ve come up with the following solution.
I created a shared package share
with the following content:
package share
import (
"context"
"log/slog"
)
type loggerKeyType struct{}
var loggerKey = loggerKeyType{}
func LogWithContext(ctx context.Context, logger *slog.Logger) context.Context {
if ctx == nil {
ctx = context.Background()
}
return context.WithValue(ctx, loggerKey, logger)
}
func LoggerFromContext(ctx context.Context) *slog.Logger {
logger, ok := ctx.Value(loggerKey).(*slog.Logger)
if !ok {
slog.Error("failed to retrieve logger from context")
return slog.Default()
}
return logger
}
And I use it further like this:
// middleware
log = log.With("telegram_id", userTGID, "telegram_username", c.Sender().Username)
ctx = share.LogWithContext(ctx, log)
user, err := userRepo.FindByTelegramID(ctx, userTGID)
// repository
log := share.LoggerFromContext(ctx)
I’m not sure how applicable this is in real projects or what issues it might cause, but for now I’ll stick with this approach. Thanks, everyone.