From c8bdf07c3afdc29a46edee2f89dd2918fcae6f96 Mon Sep 17 00:00:00 2001 From: Priyansh Choudhary Date: Fri, 8 Aug 2025 17:12:46 +0530 Subject: [PATCH] Add context logger utilities for enhanced logging support Signed-off-by: Priyansh Choudhary --- .../udmrepo/kopialib/backend/azure.go | 3 +-- .../backend/azure/azure_storage_wrapper.go | 12 +++++++----- .../udmrepo/kopialib/backend/file_system.go | 3 +++ pkg/repository/udmrepo/kopialib/backend/gcs.go | 3 +++ pkg/repository/udmrepo/kopialib/backend/s3.go | 3 +++ pkg/repository/udmrepo/repo.go | 17 +++++++++++++++++ 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/pkg/repository/udmrepo/kopialib/backend/azure.go b/pkg/repository/udmrepo/kopialib/backend/azure.go index ead95406c..090c56bff 100644 --- a/pkg/repository/udmrepo/kopialib/backend/azure.go +++ b/pkg/repository/udmrepo/kopialib/backend/azure.go @@ -38,12 +38,11 @@ func (c *AzureBackend) Setup(ctx context.Context, flags map[string]string, logge c.option = azure.Option{ Config: flags, Limits: setupLimits(ctx, flags), - Logger: logger, } return nil } func (c *AzureBackend) Connect(ctx context.Context, isCreate bool, logger logrus.FieldLogger) (blob.Storage, error) { - c.option.Logger = logger + ctx = udmrepo.WithLogger(ctx, logger) return azure.NewStorage(ctx, &c.option, false) } diff --git a/pkg/repository/udmrepo/kopialib/backend/azure/azure_storage_wrapper.go b/pkg/repository/udmrepo/kopialib/backend/azure/azure_storage_wrapper.go index 967de3dea..7d4fad9ff 100644 --- a/pkg/repository/udmrepo/kopialib/backend/azure/azure_storage_wrapper.go +++ b/pkg/repository/udmrepo/kopialib/backend/azure/azure_storage_wrapper.go @@ -19,8 +19,6 @@ package azure import ( "context" - "github.com/sirupsen/logrus" - "github.com/kopia/kopia/repo/blob" "github.com/kopia/kopia/repo/blob/azure" "github.com/kopia/kopia/repo/blob/throttling" @@ -34,13 +32,12 @@ const ( ) func init() { - blob.AddSupportedStorage(storageType, Option{Logger: logrus.New()}, NewStorage) + blob.AddSupportedStorage(storageType, Option{}, NewStorage) } type Option struct { Config map[string]string `json:"config" kopia:"sensitive"` Limits throttling.Limits - Logger logrus.FieldLogger } type Storage struct { @@ -58,7 +55,10 @@ func (s *Storage) ConnectionInfo() blob.ConnectionInfo { func NewStorage(ctx context.Context, option *Option, isCreate bool) (blob.Storage, error) { cfg := option.Config - client, _, err := azureutil.NewStorageClient(option.Logger, cfg) + // Get logger from context + logger := udmrepo.LoggerFromContext(ctx) + + client, _, err := azureutil.NewStorageClient(logger, cfg) if err != nil { return nil, err } @@ -73,6 +73,8 @@ func NewStorage(ctx context.Context, option *Option, isCreate bool) (blob.Storag return nil, err } + logger.Info("Successfully created Azure storage backend") + return &Storage{ Option: option, Storage: azStorage, diff --git a/pkg/repository/udmrepo/kopialib/backend/file_system.go b/pkg/repository/udmrepo/kopialib/backend/file_system.go index 98f272c46..f5aa6c891 100644 --- a/pkg/repository/udmrepo/kopialib/backend/file_system.go +++ b/pkg/repository/udmrepo/kopialib/backend/file_system.go @@ -50,6 +50,8 @@ func (c *FsBackend) Setup(ctx context.Context, flags map[string]string, logger l c.options.FileMode = defaultFileMode c.options.DirectoryMode = defaultDirMode + ctx = udmrepo.WithLogger(ctx, logger) + c.options.Limits = setupLimits(ctx, flags) return nil @@ -59,6 +61,7 @@ func (c *FsBackend) Connect(ctx context.Context, isCreate bool, logger logrus.Fi if !filepath.IsAbs(c.options.Path) { return nil, errors.Errorf("filesystem repository path is not absolute, path: %s", c.options.Path) } + ctx = udmrepo.WithLogger(ctx, logger) return filesystem.New(ctx, &c.options, isCreate) } diff --git a/pkg/repository/udmrepo/kopialib/backend/gcs.go b/pkg/repository/udmrepo/kopialib/backend/gcs.go index 243f054dc..01f43a0af 100644 --- a/pkg/repository/udmrepo/kopialib/backend/gcs.go +++ b/pkg/repository/udmrepo/kopialib/backend/gcs.go @@ -46,11 +46,14 @@ func (c *GCSBackend) Setup(ctx context.Context, flags map[string]string, logger c.options.Prefix = optionalHaveString(udmrepo.StoreOptionPrefix, flags) c.options.ReadOnly = optionalHaveBool(ctx, udmrepo.StoreOptionGcsReadonly, flags) + ctx = udmrepo.WithLogger(ctx, logger) + c.options.Limits = setupLimits(ctx, flags) return nil } func (c *GCSBackend) Connect(ctx context.Context, isCreate bool, logger logrus.FieldLogger) (blob.Storage, error) { + ctx = udmrepo.WithLogger(ctx, logger) return gcs.New(ctx, &c.options, false) } diff --git a/pkg/repository/udmrepo/kopialib/backend/s3.go b/pkg/repository/udmrepo/kopialib/backend/s3.go index 2f7f7d93c..bd15bae59 100644 --- a/pkg/repository/udmrepo/kopialib/backend/s3.go +++ b/pkg/repository/udmrepo/kopialib/backend/s3.go @@ -48,11 +48,14 @@ func (c *S3Backend) Setup(ctx context.Context, flags map[string]string, logger l c.options.SessionToken = optionalHaveString(udmrepo.StoreOptionS3Token, flags) c.options.RootCA = optionalHaveBase64(ctx, udmrepo.StoreOptionCACert, flags) + ctx = udmrepo.WithLogger(ctx, logger) + c.options.Limits = setupLimits(ctx, flags) return nil } func (c *S3Backend) Connect(ctx context.Context, isCreate bool, logger logrus.FieldLogger) (blob.Storage, error) { + ctx = udmrepo.WithLogger(ctx, logger) return s3.New(ctx, &c.options, false) } diff --git a/pkg/repository/udmrepo/repo.go b/pkg/repository/udmrepo/repo.go index 0adb39751..204146242 100644 --- a/pkg/repository/udmrepo/repo.go +++ b/pkg/repository/udmrepo/repo.go @@ -20,6 +20,8 @@ import ( "context" "io" "time" + + "github.com/sirupsen/logrus" ) type ID string @@ -156,3 +158,18 @@ type ObjectWriter interface { // Result returns the object's unified identifier after the write completes. Result() (ID, error) } + +type ctxKeyLogger struct{} + +// WithLogger returns a new context with the provided logger. +func WithLogger(ctx context.Context, logger logrus.FieldLogger) context.Context { + return context.WithValue(ctx, ctxKeyLogger{}, logger) +} + +// LoggerFromContext retrieves the logger from the context, or returns a default logger if none found. +func LoggerFromContext(ctx context.Context) logrus.FieldLogger { + if logger, ok := ctx.Value(ctxKeyLogger{}).(logrus.FieldLogger); ok && logger != nil { + return logger + } + return logrus.New() +}