func (l *loggerWrapper) Attributes(ctx context.Context, path string, options *ReaderOptions) (*Attributes, error) {
	l.printf("%v: attrs: %v", l.name, path)
	a, err := l.fs.Attributes(ctx, path, options)
	if err != nil {
		l.printf("%v: attrs error: %v: %v", l.name, path, err)
	}
	return a, err
}
Attributes implements FS.
package storage
import (
	"context"
	"fmt"
	"io"
)
type Logger interface {
	Print(v ...interface{})
}
func NewLoggerWrapper(fs FS, name string, l Logger) FS {
	return &loggerWrapper{
		fs:     fs,
		name:   name,
		logger: l,
	}
}
type loggerWrapper struct {
	fs FS
	name   string
	logger Logger
}
func (l *loggerWrapper) printf(format string, v ...interface{}) {
	l.logger.Print(fmt.Sprintf(format, v...))
}
func (l *loggerWrapper) Open(ctx context.Context, path string, options *ReaderOptions) (*File, error) {
	l.printf("%v: open: %v", l.name, path)
	f, err := l.fs.Open(ctx, path, options)
	if err != nil {
		l.printf("%v: open error: %v: %v", l.name, path, err)
	}
	return f, err
}