Implement context-based logging utilities for UDM repositories

Signed-off-by: Priyansh Choudhary <im1706@gmail.com>
This commit is contained in:
Priyansh Choudhary
2025-08-11 13:42:13 +05:30
parent c8bdf07c3a
commit 560df6edc3
8 changed files with 57 additions and 23 deletions
+6
View File
@@ -0,0 +1,6 @@
### Enhanced Logging Support for UDM Repositories
- Introduced context-based logger utilities (`WithLogger` and `LoggerFromContext`) in `pkg/repository/udmrepo/logging/context.go` to allow passing and retrieving loggers via context.
- Refactored backend implementations (Azure, GCS, S3, and Filesystem) to use context-based logging instead of passing loggers directly through options or arguments
**PR:** [#9168](https://github.com/vmware-tanzu/velero/pull/9168) - Add context logger utilities for enhanced logging support
@@ -25,6 +25,7 @@ import (
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo/kopialib/backend/azure"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo/logging"
)
type AzureBackend struct {
@@ -43,6 +44,6 @@ func (c *AzureBackend) Setup(ctx context.Context, flags map[string]string, logge
}
func (c *AzureBackend) Connect(ctx context.Context, isCreate bool, logger logrus.FieldLogger) (blob.Storage, error) {
ctx = udmrepo.WithLogger(ctx, logger)
ctx = logging.WithLogger(ctx, logger)
return azure.NewStorage(ctx, &c.option, false)
}
@@ -24,6 +24,7 @@ import (
"github.com/kopia/kopia/repo/blob/throttling"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo/logging"
azureutil "github.com/vmware-tanzu/velero/pkg/util/azure"
)
@@ -56,7 +57,7 @@ func NewStorage(ctx context.Context, option *Option, isCreate bool) (blob.Storag
cfg := option.Config
// Get logger from context
logger := udmrepo.LoggerFromContext(ctx)
logger := logging.LoggerFromContext(ctx)
client, _, err := azureutil.NewStorageClient(logger, cfg)
if err != nil {
@@ -27,6 +27,7 @@ import (
"github.com/pkg/errors"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo/logging"
)
type FsBackend struct {
@@ -50,7 +51,7 @@ 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)
ctx = logging.WithLogger(ctx, logger)
c.options.Limits = setupLimits(ctx, flags)
@@ -61,7 +62,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)
ctx = logging.WithLogger(ctx, logger)
return filesystem.New(ctx, &c.options, isCreate)
}
@@ -25,6 +25,7 @@ import (
"github.com/kopia/kopia/repo/blob/gcs"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo/logging"
)
type GCSBackend struct {
@@ -46,7 +47,7 @@ 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)
ctx = logging.WithLogger(ctx, logger)
c.options.Limits = setupLimits(ctx, flags)
@@ -54,6 +55,6 @@ func (c *GCSBackend) Setup(ctx context.Context, flags map[string]string, logger
}
func (c *GCSBackend) Connect(ctx context.Context, isCreate bool, logger logrus.FieldLogger) (blob.Storage, error) {
ctx = udmrepo.WithLogger(ctx, logger)
ctx = logging.WithLogger(ctx, logger)
return gcs.New(ctx, &c.options, false)
}
@@ -25,6 +25,7 @@ import (
"github.com/kopia/kopia/repo/blob/s3"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo"
"github.com/vmware-tanzu/velero/pkg/repository/udmrepo/logging"
)
type S3Backend struct {
@@ -48,7 +49,7 @@ 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)
ctx = logging.WithLogger(ctx, logger)
c.options.Limits = setupLimits(ctx, flags)
@@ -56,6 +57,6 @@ func (c *S3Backend) Setup(ctx context.Context, flags map[string]string, logger l
}
func (c *S3Backend) Connect(ctx context.Context, isCreate bool, logger logrus.FieldLogger) (blob.Storage, error) {
ctx = udmrepo.WithLogger(ctx, logger)
ctx = logging.WithLogger(ctx, logger)
return s3.New(ctx, &c.options, false)
}
+38
View File
@@ -0,0 +1,38 @@
/*
Copyright the Velero contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package logging
import (
"context"
"github.com/sirupsen/logrus"
)
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()
}
-15
View File
@@ -20,8 +20,6 @@ import (
"context"
"io"
"time"
"github.com/sirupsen/logrus"
)
type ID string
@@ -159,17 +157,4 @@ type ObjectWriter interface {
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()
}