diff --git a/go.mod b/go.mod index 35e26c8f7f..4b5fa0edfc 100644 --- a/go.mod +++ b/go.mod @@ -41,6 +41,7 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 + go.uber.org/zap/exp v0.1.1-0.20240913022758-ede8e1888f83 golang.org/x/crypto v0.27.0 golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 golang.org/x/mod v0.21.0 diff --git a/go.sum b/go.sum index 40219a81b5..79d9abcc03 100644 --- a/go.sum +++ b/go.sum @@ -296,6 +296,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap/exp v0.1.1-0.20240913022758-ede8e1888f83 h1:wpjRiPjppWaUIH+GC0bRvsdaH2K4Dw49dEJa7MX01Mk= +go.uber.org/zap/exp v0.1.1-0.20240913022758-ede8e1888f83/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= diff --git a/private/buf/bufctl/controller.go b/private/buf/bufctl/controller.go index 5246fc4f4e..0e1322348a 100644 --- a/private/buf/bufctl/controller.go +++ b/private/buf/bufctl/controller.go @@ -20,6 +20,7 @@ import ( "fmt" "io" "io/fs" + "log/slog" "net/http" "sort" @@ -48,7 +49,6 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/protovalidate-go" "go.uber.org/multierr" - "go.uber.org/zap" "google.golang.org/protobuf/proto" ) @@ -131,7 +131,7 @@ type Controller interface { } func NewController( - logger *zap.Logger, + logger *slog.Logger, container app.EnvStdioContainer, graphProvider bufmodule.GraphProvider, moduleKeyProvider bufmodule.ModuleKeyProvider, @@ -166,7 +166,7 @@ func NewController( // it out again. The separation of concerns here is that the controller doesnt itself // deal in the global variables. type controller struct { - logger *zap.Logger + logger *slog.Logger container app.EnvStdioContainer moduleDataProvider bufmodule.ModuleDataProvider graphProvider bufmodule.GraphProvider @@ -188,7 +188,7 @@ type controller struct { } func newController( - logger *zap.Logger, + logger *slog.Logger, container app.EnvStdioContainer, graphProvider bufmodule.GraphProvider, moduleKeyProvider bufmodule.ModuleKeyProvider, @@ -1016,10 +1016,11 @@ func (c *controller) buildTargetImageWithConfigs( modules := bufmodule.ModuleSetTargetModules(workspace) imageWithConfigs := make([]ImageWithConfig, 0, len(modules)) for _, module := range modules { - c.logger.Debug( + c.logger.DebugContext( + ctx, "building image for target module", - zap.String("moduleOpaqueID", module.OpaqueID()), - zap.String("moduleDescription", module.Description()), + slog.String("moduleOpaqueID", module.OpaqueID()), + slog.String("moduleDescription", module.Description()), ) opaqueID := module.OpaqueID() // We need to make sure that all dependencies are non-targets, so that they @@ -1137,14 +1138,14 @@ func (c *controller) warnUnconfiguredTransitiveImports( continue } if _, ok := configuredModuleFullNameStringMap[moduleFullNameString]; !ok { - c.logger.Sugar().Warnf( + c.logger.Warn(fmt.Sprintf( `File %q imports %q, which is not in your workspace or in the dependencies declared in your buf.yaml, but is found in transitive dependency %q. Declare %q in the deps key in your buf.yaml.`, imageFile.Path(), importPath, moduleFullNameString, moduleFullNameString, - ) + )) } } } diff --git a/private/buf/bufcurl/resolver.go b/private/buf/bufcurl/resolver.go index 2273114629..7ea4fdb8e3 100644 --- a/private/buf/bufcurl/resolver.go +++ b/private/buf/bufcurl/resolver.go @@ -16,12 +16,12 @@ package bufcurl import ( "context" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/gen/data/datawkt" "github.com/bufbuild/buf/private/pkg/protoencoding" - "go.uber.org/zap" "google.golang.org/protobuf/reflect/protoreflect" ) @@ -103,7 +103,7 @@ func (c *combinedResolver) ListServices() ([]protoreflect.FullName, error) { } // NewWKTResolver returns a Resolver that can resolve all well-known types. -func NewWKTResolver(ctx context.Context, logger *zap.Logger) (Resolver, error) { +func NewWKTResolver(ctx context.Context, logger *slog.Logger) (Resolver, error) { moduleSet, err := bufmodule.NewModuleSetBuilder( ctx, logger, diff --git a/private/buf/buffetch/buffetch.go b/private/buf/buffetch/buffetch.go index acab167133..b52d6d0716 100644 --- a/private/buf/buffetch/buffetch.go +++ b/private/buf/buffetch/buffetch.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "io" + "log/slog" "net/http" "github.com/bufbuild/buf/private/buf/buffetch/internal" @@ -30,7 +31,6 @@ import ( "github.com/bufbuild/buf/private/pkg/httpauth" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/stringutil" - "go.uber.org/zap" ) const ( @@ -243,12 +243,12 @@ type RefParser interface { // NewRefParser returns a new RefParser. // // This defaults to dir or module. -func NewRefParser(logger *zap.Logger) RefParser { +func NewRefParser(logger *slog.Logger) RefParser { return newRefParser(logger) } // NewMessageRefParser returns a new RefParser for messages only. -func NewMessageRefParser(logger *zap.Logger, options ...MessageRefParserOption) MessageRefParser { +func NewMessageRefParser(logger *slog.Logger, options ...MessageRefParserOption) MessageRefParser { return newMessageRefParser(logger, options...) } @@ -267,29 +267,29 @@ func MessageRefParserWithDefaultMessageEncoding(defaultMessageEncoding MessageEn // NewSourceRefParser returns a new RefParser for sources only. // // This defaults to dir. -func NewSourceRefParser(logger *zap.Logger) SourceRefParser { +func NewSourceRefParser(logger *slog.Logger) SourceRefParser { return newSourceRefParser(logger) } // NewDirRefParser returns a new RefParser for dirs only. -func NewDirRefParser(logger *zap.Logger) DirRefParser { +func NewDirRefParser(logger *slog.Logger) DirRefParser { return newDirRefParser(logger) } // NewDirOrProtoFileRefParser returns a new RefParser for dirs only. -func NewDirOrProtoFileRefParser(logger *zap.Logger) DirOrProtoFileRefParser { +func NewDirOrProtoFileRefParser(logger *slog.Logger) DirOrProtoFileRefParser { return newDirOrProtoFileRefParser(logger) } // NewModuleRefParser returns a new RefParser for modules only. -func NewModuleRefParser(logger *zap.Logger) ModuleRefParser { +func NewModuleRefParser(logger *slog.Logger) ModuleRefParser { return newModuleRefParser(logger) } // NewSourceOrModuleRefParser returns a new RefParser for sources or modules only. // // This defaults to dir or module. -func NewSourceOrModuleRefParser(logger *zap.Logger) SourceOrModuleRefParser { +func NewSourceOrModuleRefParser(logger *slog.Logger) SourceOrModuleRefParser { return newSourceOrModuleRefParser(logger) } @@ -423,7 +423,7 @@ type Reader interface { // NewReader returns a new Reader. func NewReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, httpAuthenticator httpauth.Authenticator, @@ -442,7 +442,7 @@ func NewReader( // NewMessageReader returns a new MessageReader. func NewMessageReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, httpAuthenticator httpauth.Authenticator, @@ -459,7 +459,7 @@ func NewMessageReader( // NewSourceReader returns a new SourceReader. func NewSourceReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, httpAuthenticator httpauth.Authenticator, @@ -476,7 +476,7 @@ func NewSourceReader( // NewDirReader returns a new DirReader. func NewDirReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, ) DirReader { return newDirReader( @@ -487,7 +487,7 @@ func NewDirReader( // NewModuleFetcher returns a new ModuleFetcher. func NewModuleFetcher( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, moduleKeyProvider bufmodule.ModuleKeyProvider, ) ModuleFetcher { @@ -510,7 +510,7 @@ type Writer interface { // NewWriter returns a new Writer. func NewWriter( - logger *zap.Logger, + logger *slog.Logger, ) Writer { return newWriter( logger, @@ -529,7 +529,7 @@ type ProtoFileWriter interface { // NewProtoFileWriter returns a new ProtoFileWriter. func NewProtoFileWriter( - logger *zap.Logger, + logger *slog.Logger, ) ProtoFileWriter { return newProtoFileWriter( logger, diff --git a/private/buf/buffetch/buffetch_test.go b/private/buf/buffetch/buffetch_test.go index 07cc5a0b43..7aaf929a4f 100644 --- a/private/buf/buffetch/buffetch_test.go +++ b/private/buf/buffetch/buffetch_test.go @@ -17,14 +17,15 @@ package buffetch import ( "context" "io" + "log/slog" "path/filepath" "testing" "github.com/bufbuild/buf/private/buf/buffetch/internal" "github.com/bufbuild/buf/private/pkg/app" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestRoundTripBin(t *testing.T) { @@ -100,7 +101,7 @@ func testRoundTripLocalFile( expectedFormat string, expectedCompressionType internal.CompressionType, ) { - logger := zap.NewNop() + logger := slogtestext.NewLogger(t) refParser := newRefParser(logger) reader := testNewFetchReader(logger) writer := testNewFetchWriter(logger) @@ -133,7 +134,7 @@ func testRoundTripLocalFile( require.Equal(t, string(expectedData), string(actualData)) } -func testNewFetchReader(logger *zap.Logger) internal.Reader { +func testNewFetchReader(logger *slog.Logger) internal.Reader { storageosProvider := storageos.NewProvider(storageos.ProviderWithSymlinks()) return internal.NewReader( logger, @@ -142,7 +143,7 @@ func testNewFetchReader(logger *zap.Logger) internal.Reader { ) } -func testNewFetchWriter(logger *zap.Logger) internal.Writer { +func testNewFetchWriter(logger *slog.Logger) internal.Writer { return internal.NewWriter( logger, internal.WithWriterLocal(), diff --git a/private/buf/buffetch/internal/internal.go b/private/buf/buffetch/internal/internal.go index c06b02d7af..3bd250ea9b 100644 --- a/private/buf/buffetch/internal/internal.go +++ b/private/buf/buffetch/internal/internal.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io" + "log/slog" "net/http" "strconv" @@ -29,7 +30,6 @@ import ( "github.com/bufbuild/buf/private/pkg/httpauth" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" ) const ( @@ -400,7 +400,7 @@ type RefParser interface { } // NewRefParser returns a new RefParser. -func NewRefParser(logger *zap.Logger, options ...RefParserOption) RefParser { +func NewRefParser(logger *slog.Logger, options ...RefParserOption) RefParser { return newRefParser(logger, options...) } @@ -462,7 +462,7 @@ type Reader interface { // NewReader returns a new Reader. func NewReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, options ...ReaderOption, ) Reader { @@ -486,7 +486,7 @@ type Writer interface { // NewWriter returns a new Writer. func NewWriter( - logger *zap.Logger, + logger *slog.Logger, options ...WriterOption, ) Writer { return newWriter( @@ -507,7 +507,7 @@ type ProtoFileWriter interface { // NewProtoWriter returns a new ProtoWriter. func NewProtoFileWriter( - logger *zap.Logger, + logger *slog.Logger, ) ProtoFileWriter { return newProtoFileWriter( logger, diff --git a/private/buf/buffetch/internal/proto_file_writer.go b/private/buf/buffetch/internal/proto_file_writer.go index df7f887ffe..ffbf22ec01 100644 --- a/private/buf/buffetch/internal/proto_file_writer.go +++ b/private/buf/buffetch/internal/proto_file_writer.go @@ -19,20 +19,20 @@ import ( "errors" "fmt" "io" + "log/slog" "os" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/ioext" "github.com/bufbuild/buf/private/pkg/normalpath" - "go.uber.org/zap" ) type protoFileWriter struct { - logger *zap.Logger + logger *slog.Logger } func newProtoFileWriter( - logger *zap.Logger, + logger *slog.Logger, ) *protoFileWriter { return &protoFileWriter{ logger: logger, diff --git a/private/buf/buffetch/internal/reader.go b/private/buf/buffetch/internal/reader.go index 3457658d06..df9e4d5183 100644 --- a/private/buf/buffetch/internal/reader.go +++ b/private/buf/buffetch/internal/reader.go @@ -21,6 +21,7 @@ import ( "fmt" "io" "io/fs" + "log/slog" "net/http" "os" "path/filepath" @@ -42,11 +43,10 @@ import ( "github.com/klauspost/compress/zstd" "github.com/klauspost/pgzip" "go.uber.org/multierr" - "go.uber.org/zap" ) type reader struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider localEnabled bool @@ -64,7 +64,7 @@ type reader struct { } func newReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, options ...ReaderOption, ) *reader { @@ -563,7 +563,7 @@ func getGitURL(gitRef GitRef) (string, error) { // Use for memory buckets i.e. archive and git. func getReadBucketCloserForBucket( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, inputBucket storage.ReadBucketCloser, inputSubDirPath string, targetPaths []string, @@ -610,10 +610,11 @@ func getReadBucketCloserForBucket( storage.MapOnPrefix(bucketPath), ) } - logger.Debug( + logger.DebugContext( + ctx, "buffetch creating new bucket", - zap.String("bucketPath", bucketPath), - zap.Strings("targetPaths", bucketTargeting.TargetPaths()), + slog.String("bucketPath", bucketPath), + slog.Any("targetPaths", bucketTargeting.TargetPaths()), ) readBucketCloser := newReadBucketCloser(inputBucket, bucketTargeting) return readBucketCloser, bucketTargeting, nil @@ -622,7 +623,7 @@ func getReadBucketCloserForBucket( // Use for directory-based buckets. func getReadWriteBucketForOS( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, inputDirPath string, targetPaths []string, @@ -803,7 +804,7 @@ func getReadWriteBucketForOS( // Use for ProtoFileRefs. func getReadBucketCloserForOSProtoFile( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, protoFilePath string, terminateFunc buftarget.TerminateFunc, diff --git a/private/buf/buffetch/internal/reader_test.go b/private/buf/buffetch/internal/reader_test.go index 02aadea68b..5fe0929bed 100644 --- a/private/buf/buffetch/internal/reader_test.go +++ b/private/buf/buffetch/internal/reader_test.go @@ -22,11 +22,11 @@ import ( "github.com/bufbuild/buf/private/buf/buftarget" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/osext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestGetReadBucketCloserForBucketNoTerminateFileName(t *testing.T) { @@ -36,7 +36,7 @@ func TestGetReadBucketCloserForBucketNoTerminateFileName(t *testing.T) { require.NoError(t, err) readBucketCloser, bucketTargeting, err := getReadBucketCloserForBucket( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storage.NopReadBucketCloser(inputBucket), "three/four/five", nil, // no target paths @@ -55,7 +55,7 @@ func TestGetReadBucketCloserTerminateFileName(t *testing.T) { require.NoError(t, err) readBucketCloser, bucketTargeting, err := getReadBucketCloserForBucket( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storage.NopReadBucketCloser(inputBucket), "three/four/five", nil, // no target paths @@ -77,7 +77,7 @@ func TestGetReadBucketCloserForBucketNoSubDirPath(t *testing.T) { require.NoError(t, err) readBucketCloser, bucketTargeting, err := getReadBucketCloserForBucket( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storage.NopReadBucketCloser(inputBucket), ".", nil, // no target paths @@ -101,7 +101,7 @@ func TestGetReadBucketCloserForBucketAbs(t *testing.T) { require.NoError(t, err) readBucketCloser, bucketTargeting, err := getReadBucketCloserForBucket( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storage.NopReadBucketCloser(inputBucket), "three/four/five", nil, // no target paths @@ -121,7 +121,7 @@ func TestGetReadWriteBucketForOSNoTerminateFileName(t *testing.T) { ctx := context.Background() readWriteBucket, bucketTargeting, err := getReadWriteBucketForOS( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "testdata/bufyaml/one/two/three/four/five", nil, // no target paths @@ -141,7 +141,7 @@ func TestGetReadWriteBucketForOSTerminateFileName(t *testing.T) { ctx := context.Background() readWriteBucket, bucketTargeting, err := getReadWriteBucketForOS( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "testdata/bufyaml/one/two/three/four/five", nil, // no target paths @@ -175,7 +175,7 @@ func TestGetReadWriteBucketForOSParentPwd(t *testing.T) { }() readWriteBucket, bucketTargeting, err := getReadWriteBucketForOS( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "five", nil, // no target paths @@ -211,7 +211,7 @@ func TestGetReadWriteBucketForOSAbsPwd(t *testing.T) { }() readWriteBucket, bucketTargeting, err := getReadWriteBucketForOS( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), normalpath.Join(absDirPath, "testdata/bufyaml/one/two/three/four/five"), nil, // no target paths @@ -234,7 +234,7 @@ func TestGetReadBucketCloserForOSProtoFileNoWorkspaceTerminateFileName(t *testin ctx := context.Background() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "testdata/bufyaml/one/two/three/four/five/proto/foo.proto", testNewTerminateAtFileNamesFunc("buf.yaml"), @@ -255,7 +255,7 @@ func TestGetReadBucketCloserForOSProtoFileTerminateFileName(t *testing.T) { ctx := context.Background() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "testdata/bufyaml/one/two/three/four/five/proto/foo.proto", testNewTerminateAtFileNamesFunc("buf.work.yaml"), @@ -290,7 +290,7 @@ func TestGetReadBucketCloserForOSProtoFileParentPwd(t *testing.T) { }() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "five/proto/foo.proto", testNewTerminateAtFileNamesFunc("buf.work.yaml"), @@ -327,7 +327,7 @@ func TestGetReadBucketCloserForOSProtoFileAbsPwd(t *testing.T) { }() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), normalpath.Join(absDirPath, "testdata/bufyaml/one/two/three/four/five/proto/foo.proto"), testNewTerminateAtFileNamesFunc("buf.work.yaml"), @@ -351,7 +351,7 @@ func TestGetReadBucketCloserForOSProtoFileNoBufYAMLTerminateFileName(t *testing. ctx := context.Background() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "testdata/nobufyaml/one/two/three/four/five/proto/foo.proto", testNewTerminateAtFileNamesFunc("buf.work.yaml"), @@ -383,7 +383,7 @@ func TestGetReadBucketCloserForOSProtoFileNoBufYAMLParentPwd(t *testing.T) { }() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), "five/proto/foo.proto", testNewTerminateAtFileNamesFunc("buf.work.yaml"), @@ -421,7 +421,7 @@ func TestGetReadBucketCloserForOSProtoFileNoBufYAMLAbsPwd(t *testing.T) { }() readBucketCloser, bucketTargeting, err := getReadBucketCloserForOSProtoFile( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), normalpath.Join(absDirPath, "testdata/nobufyaml/one/two/three/four/five/proto/foo.proto"), testNewTerminateAtFileNamesFunc("buf.work.yaml"), diff --git a/private/buf/buffetch/internal/ref_parser.go b/private/buf/buffetch/internal/ref_parser.go index 0352ca8cae..43cb699a91 100644 --- a/private/buf/buffetch/internal/ref_parser.go +++ b/private/buf/buffetch/internal/ref_parser.go @@ -16,6 +16,7 @@ package internal import ( "context" + "log/slog" "sort" "strconv" "strings" @@ -25,11 +26,10 @@ import ( "github.com/bufbuild/buf/private/pkg/git" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/syserror" - "go.uber.org/zap" ) type refParser struct { - logger *zap.Logger + logger *slog.Logger rawRefProcessor func(*RawRef) error singleFormatToInfo map[string]*singleFormatInfo archiveFormatToInfo map[string]*archiveFormatInfo @@ -39,7 +39,7 @@ type refParser struct { protoFileFormatToInfo map[string]*protoFileFormatInfo } -func newRefParser(logger *zap.Logger, options ...RefParserOption) *refParser { +func newRefParser(logger *slog.Logger, options ...RefParserOption) *refParser { refParser := &refParser{ logger: logger, singleFormatToInfo: make(map[string]*singleFormatInfo), diff --git a/private/buf/buffetch/internal/writer.go b/private/buf/buffetch/internal/writer.go index 63f4a9615f..b01b16cd1f 100644 --- a/private/buf/buffetch/internal/writer.go +++ b/private/buf/buffetch/internal/writer.go @@ -20,17 +20,17 @@ import ( "errors" "fmt" "io" + "log/slog" "os" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/ioext" "github.com/klauspost/compress/zstd" "go.uber.org/multierr" - "go.uber.org/zap" ) type writer struct { - logger *zap.Logger + logger *slog.Logger // never set for now (no corresponding option) httpEnabled bool @@ -39,7 +39,7 @@ type writer struct { } func newWriter( - logger *zap.Logger, + logger *slog.Logger, options ...WriterOption, ) *writer { writer := &writer{ diff --git a/private/buf/buffetch/proto_file_writer.go b/private/buf/buffetch/proto_file_writer.go index 542b112b88..df7d08d54d 100644 --- a/private/buf/buffetch/proto_file_writer.go +++ b/private/buf/buffetch/proto_file_writer.go @@ -17,10 +17,10 @@ package buffetch import ( "context" "io" + "log/slog" "github.com/bufbuild/buf/private/buf/buffetch/internal" "github.com/bufbuild/buf/private/pkg/app" - "go.uber.org/zap" ) type protoFileWriter struct { @@ -28,7 +28,7 @@ type protoFileWriter struct { } func newProtoFileWriter( - logger *zap.Logger, + logger *slog.Logger, ) *protoFileWriter { return &protoFileWriter{ internalProtoFileWriter: internal.NewProtoFileWriter( diff --git a/private/buf/buffetch/reader.go b/private/buf/buffetch/reader.go index 1faa5123d4..fd0c248f3d 100644 --- a/private/buf/buffetch/reader.go +++ b/private/buf/buffetch/reader.go @@ -17,6 +17,7 @@ package buffetch import ( "context" "io" + "log/slog" "net/http" "github.com/bufbuild/buf/private/buf/buffetch/internal" @@ -26,7 +27,6 @@ import ( "github.com/bufbuild/buf/private/pkg/git" "github.com/bufbuild/buf/private/pkg/httpauth" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" ) type reader struct { @@ -34,7 +34,7 @@ type reader struct { } func newReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, httpAuthenticator httpauth.Authenticator, @@ -62,7 +62,7 @@ func newReader( } func newMessageReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, httpAuthenticator httpauth.Authenticator, @@ -83,7 +83,7 @@ func newMessageReader( } func newSourceReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, httpAuthenticator httpauth.Authenticator, @@ -107,7 +107,7 @@ func newSourceReader( } func newDirReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, ) *reader { return &reader{ @@ -120,7 +120,7 @@ func newDirReader( } func newModuleFetcher( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, moduleKeyProvider bufmodule.ModuleKeyProvider, ) *reader { diff --git a/private/buf/buffetch/ref_parser.go b/private/buf/buffetch/ref_parser.go index 3efb0b2156..d43f700aa0 100644 --- a/private/buf/buffetch/ref_parser.go +++ b/private/buf/buffetch/ref_parser.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "log/slog" "os" "path/filepath" "strings" @@ -27,15 +28,14 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/syserror" - "go.uber.org/zap" ) type refParser struct { - logger *zap.Logger + logger *slog.Logger fetchRefParser internal.RefParser } -func newRefParser(logger *zap.Logger) *refParser { +func newRefParser(logger *slog.Logger) *refParser { return &refParser{ logger: logger, fetchRefParser: internal.NewRefParser( @@ -89,7 +89,7 @@ func newRefParser(logger *zap.Logger) *refParser { } } -func newMessageRefParser(logger *zap.Logger, options ...MessageRefParserOption) *refParser { +func newMessageRefParser(logger *slog.Logger, options ...MessageRefParserOption) *refParser { messageRefParserOptions := newMessageRefParserOptions() for _, option := range options { option(messageRefParserOptions) @@ -128,7 +128,7 @@ func newMessageRefParser(logger *zap.Logger, options ...MessageRefParserOption) } } -func newSourceRefParser(logger *zap.Logger) *refParser { +func newSourceRefParser(logger *slog.Logger) *refParser { return &refParser{ logger: logger, fetchRefParser: internal.NewRefParser( @@ -156,7 +156,7 @@ func newSourceRefParser(logger *zap.Logger) *refParser { } } -func newDirRefParser(logger *zap.Logger) *refParser { +func newDirRefParser(logger *slog.Logger) *refParser { return &refParser{ logger: logger, fetchRefParser: internal.NewRefParser( @@ -167,7 +167,7 @@ func newDirRefParser(logger *zap.Logger) *refParser { } } -func newDirOrProtoFileRefParser(logger *zap.Logger) *refParser { +func newDirOrProtoFileRefParser(logger *slog.Logger) *refParser { return &refParser{ logger: logger, fetchRefParser: internal.NewRefParser( @@ -179,7 +179,7 @@ func newDirOrProtoFileRefParser(logger *zap.Logger) *refParser { } } -func newModuleRefParser(logger *zap.Logger) *refParser { +func newModuleRefParser(logger *slog.Logger) *refParser { return &refParser{ logger: logger, fetchRefParser: internal.NewRefParser( @@ -190,7 +190,7 @@ func newModuleRefParser(logger *zap.Logger) *refParser { } } -func newSourceOrModuleRefParser(logger *zap.Logger) *refParser { +func newSourceOrModuleRefParser(logger *slog.Logger) *refParser { return &refParser{ logger: logger, fetchRefParser: internal.NewRefParser( @@ -539,11 +539,11 @@ func (a *refParser) getParsedRefForInputConfig( func (a *refParser) checkDeprecated(parsedRef internal.ParsedRef) { format := parsedRef.Format() if replacementFormat, ok := deprecatedCompressionFormatToReplacementFormat[format]; ok { - a.logger.Sugar().Warnf( + a.logger.Warn(fmt.Sprintf( `Format %q is deprecated. Use "format=%s,compression=gzip" instead. This will continue to work forever, but updating is recommended.`, format, replacementFormat, - ) + )) } } diff --git a/private/buf/buffetch/ref_parser_test.go b/private/buf/buffetch/ref_parser_test.go index 5c5115f865..4072adb03f 100644 --- a/private/buf/buffetch/ref_parser_test.go +++ b/private/buf/buffetch/ref_parser_test.go @@ -25,9 +25,9 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/git" "github.com/bufbuild/buf/private/pkg/normalpath" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) // TODO FUTURE: test ref from input config as well. @@ -1392,7 +1392,7 @@ func testGetParsedRef( expectedErr error, value string, ) { - parsedRef, err := newRefParser(zap.NewNop()).getParsedRef( + parsedRef, err := newRefParser(slogtestext.NewLogger(t)).getParsedRef( context.Background(), value, allFormats, @@ -1417,7 +1417,7 @@ func testGetParsedDirOrProtoFileRef( expectedErr error, value string, ) { - parsedRef, err := newDirOrProtoFileRefParser(zap.NewNop()).getParsedRef( + parsedRef, err := newDirOrProtoFileRefParser(slogtestext.NewLogger(t)).getParsedRef( context.Background(), value, dirOrProtoFileFormats, diff --git a/private/buf/buffetch/writer.go b/private/buf/buffetch/writer.go index c26a656aaa..f9be5ae037 100644 --- a/private/buf/buffetch/writer.go +++ b/private/buf/buffetch/writer.go @@ -17,10 +17,10 @@ package buffetch import ( "context" "io" + "log/slog" "github.com/bufbuild/buf/private/buf/buffetch/internal" "github.com/bufbuild/buf/private/pkg/app" - "go.uber.org/zap" ) type writer struct { @@ -28,7 +28,7 @@ type writer struct { } func newWriter( - logger *zap.Logger, + logger *slog.Logger, ) *writer { return &writer{ internalWriter: internal.NewWriter( diff --git a/private/buf/bufformat/formatter_test.go b/private/buf/bufformat/formatter_test.go index 3d3b76a47b..f57e1ede99 100644 --- a/private/buf/bufformat/formatter_test.go +++ b/private/buf/bufformat/formatter_test.go @@ -23,10 +23,10 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/diff" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestFormatter(t *testing.T) { @@ -75,7 +75,7 @@ func testFormatNoDiff(t *testing.T, path string) { runner := command.NewRunner() bucket, err := storageos.NewProvider().NewReadWriteBucket(path) require.NoError(t, err) - moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, zap.NewNop(), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) + moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) moduleSetBuilder.AddLocalModule(bucket, path, true) moduleSet, err := moduleSetBuilder.Build() require.NoError(t, err) diff --git a/private/buf/bufgen/bufgen.go b/private/buf/bufgen/bufgen.go index a87596d868..e0b0d94139 100644 --- a/private/buf/bufgen/bufgen.go +++ b/private/buf/bufgen/bufgen.go @@ -20,6 +20,7 @@ package bufgen import ( "context" "fmt" + "log/slog" "strconv" "github.com/bufbuild/buf/private/bufpkg/bufconfig" @@ -28,7 +29,6 @@ import ( "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/connectclient" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" ) const ( @@ -86,7 +86,7 @@ type Generator interface { // NewGenerator returns a new Generator. func NewGenerator( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, // Pass a clientConfig instead of a CodeGenerationServiceClient because the diff --git a/private/buf/bufgen/features.go b/private/buf/bufgen/features.go index 15a2400d2e..c5e0886d93 100644 --- a/private/buf/bufgen/features.go +++ b/private/buf/bufgen/features.go @@ -16,6 +16,7 @@ package bufgen import ( "fmt" + "log/slog" "sort" "strings" @@ -23,7 +24,6 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/pkg/slicesext" "go.uber.org/multierr" - "go.uber.org/zap" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/types/descriptorpb" "google.golang.org/protobuf/types/pluginpb" @@ -87,7 +87,7 @@ func computeRequiredFeatures(image bufimage.Image) *requiredFeatures { } func checkRequiredFeatures( - logger *zap.Logger, + logger *slog.Logger, required *requiredFeatures, responses []*pluginpb.CodeGeneratorResponse, configs []bufconfig.GeneratePluginConfig, diff --git a/private/buf/bufgen/features_test.go b/private/buf/bufgen/features_test.go index 3f7eb73bcf..3b2995314f 100644 --- a/private/buf/bufgen/features_test.go +++ b/private/buf/bufgen/features_test.go @@ -15,6 +15,8 @@ package bufgen import ( + "bytes" + "log/slog" "math" "testing" @@ -23,9 +25,6 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "go.uber.org/zap/zaptest/observer" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/descriptorpb" "google.golang.org/protobuf/types/pluginpb" @@ -173,9 +172,10 @@ func testCheckRequiredFeatures( ) { t.Helper() required := computeRequiredFeatures(image) - observed, logs := observer.New(zapcore.WarnLevel) + buffer := bytes.NewBuffer(nil) + logger := slog.New(slog.NewTextHandler(buffer, &slog.HandlerOptions{})) err := checkRequiredFeatures( - zap.New(observed), + logger, required, []*pluginpb.CodeGeneratorResponse{ codeGenResponse, @@ -192,10 +192,9 @@ func testCheckRequiredFeatures( }, ) if expectedStdErr != "" { - require.NotEmpty(t, logs.All()) - require.Equal(t, expectedStdErr, logs.All()[0].Message) + require.NotEmpty(t, buffer.String()) } else { - require.Empty(t, logs.All()) + require.Empty(t, buffer.String()) } if expectedErr != "" { require.ErrorContains(t, err, expectedErr) diff --git a/private/buf/bufgen/generator.go b/private/buf/bufgen/generator.go index dbd0d9d24d..2fe4905f78 100644 --- a/private/buf/bufgen/generator.go +++ b/private/buf/bufgen/generator.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "log/slog" "path/filepath" connect "connectrpc.com/connect" @@ -38,19 +39,18 @@ import ( "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/thread" "go.uber.org/multierr" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) type generator struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider pluginexecGenerator bufprotopluginexec.Generator clientConfig *connectclient.Config } func newGenerator( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, clientConfig *connectclient.Config, @@ -93,7 +93,7 @@ func (g *generator) Generate( } if !config.GenerateManagedConfig().Enabled() { if len(config.GenerateManagedConfig().Overrides()) != 0 || len(config.GenerateManagedConfig().Disables()) != 0 { - g.logger.Sugar().Warn("managed mode configs are set but are not enabled") + g.logger.Warn("managed mode configs are set but are not enabled") } } for _, image := range images { diff --git a/private/buf/buflsp/buflsp.go b/private/buf/buflsp/buflsp.go index 32db293e72..9ddb3121c0 100644 --- a/private/buf/buflsp/buflsp.go +++ b/private/buf/buflsp/buflsp.go @@ -20,15 +20,16 @@ package buflsp import ( "context" "fmt" + "log/slog" "sync/atomic" "github.com/bufbuild/buf/private/buf/bufctl" "github.com/bufbuild/buf/private/bufpkg/bufcheck" "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/pkg/app/appext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "github.com/bufbuild/buf/private/pkg/zaputil" "go.lsp.dev/jsonrpc2" "go.lsp.dev/protocol" "go.uber.org/zap" @@ -89,7 +90,7 @@ type lsp struct { conn jsonrpc2.Conn client protocol.Client - logger *zap.Logger + logger *slog.Logger controller bufctl.Controller checkClient bufcheck.Client rootBucket storage.ReadBucket @@ -139,7 +140,7 @@ func (l *lsp) findImportable( imports[fileInfo.Path()] = fileInfo } - l.logger.Sugar().Debugf("found imports for %q: %#v", uri, imports) + l.logger.DebugContext(ctx, fmt.Sprintf("found imports for %q: %#v", uri, imports)) return imports, nil } @@ -149,7 +150,7 @@ func (l *lsp) findImportable( func (l *lsp) newHandler() jsonrpc2.Handler { actual := protocol.ServerHandler(newServer(l), nil) return func(ctx context.Context, reply jsonrpc2.Replier, req jsonrpc2.Request) (retErr error) { - defer zaputil.DebugProfile(l.logger, zap.String("method", req.Method()), zap.ByteString("params", req.Params()))() + defer slogext.DebugProfile(l.logger, slog.String("method", req.Method()), slog.Any("params", req.Params()))() ctx = withRequestID(ctx) diff --git a/private/buf/buflsp/file.go b/private/buf/buflsp/file.go index 76aa4adf2d..f1adae9d6e 100644 --- a/private/buf/buflsp/file.go +++ b/private/buf/buflsp/file.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io" + "log/slog" "os" "slices" "strings" @@ -31,7 +32,7 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/ioext" - "github.com/bufbuild/buf/private/pkg/zaputil" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/protocompile" "github.com/bufbuild/protocompile/ast" "github.com/bufbuild/protocompile/linker" @@ -40,7 +41,6 @@ import ( "github.com/bufbuild/protocompile/reporter" "github.com/google/uuid" "go.lsp.dev/protocol" - "go.uber.org/zap" "google.golang.org/protobuf/reflect/protoreflect" ) @@ -115,7 +115,7 @@ func (f *file) Package() []string { // Reset clears all bookkeeping information on this file. func (f *file) Reset(ctx context.Context) { - f.lsp.logger.Sugar().Debugf("resetting file %v", f.uri) + f.lsp.logger.Debug(fmt.Sprintf("resetting file %v", f.uri)) // Lock and unlock to acquire the import map, then nil everything out // This map is never mutated after being created, so we only @@ -178,7 +178,7 @@ func (f *file) Update(ctx context.Context, version int32, text string) { f.lock.Lock(ctx) defer f.lock.Unlock(ctx) - f.lsp.logger.Sugar().Infof("new file version: %v, %v -> %v", f.uri, f.version, version) + f.lsp.logger.Info(fmt.Sprintf("new file version: %v, %v -> %v", f.uri, f.version, version)) f.version = version f.text = text f.hasText = true @@ -229,7 +229,7 @@ func (f *file) RefreshAST(ctx context.Context) bool { report := report{} handler := reporter.NewHandler(&report) - f.lsp.logger.Sugar().Infof("parsing AST for %v, %v", f.uri, f.version) + f.lsp.logger.Info(fmt.Sprintf("parsing AST for %v, %v", f.uri, f.version)) parsed, err := parser.Parse(f.uri.Filename(), strings.NewReader(f.text), handler) if err == nil { // Throw away the error. It doesn't contain anything not in the diagnostic array. @@ -238,7 +238,7 @@ func (f *file) RefreshAST(ctx context.Context) bool { f.fileNode = parsed f.diagnostics = report.diagnostics - f.lsp.logger.Sugar().Debugf("got %v diagnostic(s)", len(f.diagnostics)) + f.lsp.logger.Debug(fmt.Sprintf("got %v diagnostic(s)", len(f.diagnostics))) // Search for a potential package node. if f.fileNode != nil { @@ -255,7 +255,7 @@ func (f *file) RefreshAST(ctx context.Context) bool { // PublishDiagnostics publishes all of this file's diagnostics to the LSP client. func (f *file) PublishDiagnostics(ctx context.Context) { - defer zaputil.DebugProfile(f.lsp.logger, zap.String("uri", string(f.uri)))() + defer slogext.DebugProfile(f.lsp.logger, slog.String("uri", string(f.uri)))() f.lock.Lock(ctx) defer f.lock.Unlock(ctx) @@ -278,7 +278,7 @@ func (f *file) PublishDiagnostics(ctx context.Context) { func (f *file) FindModule(ctx context.Context) { workspace, err := f.lsp.controller.GetWorkspace(ctx, f.uri.Filename()) if err != nil { - f.lsp.logger.Warn("could not load workspace", zap.String("uri", string(f.uri)), zap.Error(err)) + f.lsp.logger.Warn("could not load workspace", slog.String("uri", string(f.uri)), slogext.ErrorAttr(err)) return } @@ -297,7 +297,7 @@ func (f *file) FindModule(ctx context.Context) { } } if module == nil { - f.lsp.logger.Sugar().Warnf("could not find module for %q", f.uri) + f.lsp.logger.Warn(fmt.Sprintf("could not find module for %q", f.uri)) } // Determine if this is the WKT module. We do so by checking if this module contains @@ -315,7 +315,7 @@ func (f *file) FindModule(ctx context.Context) { // IndexImports finds URIs for all of the files imported by this file. func (f *file) IndexImports(ctx context.Context) { - defer zaputil.DebugProfile(f.lsp.logger, zap.String("uri", string(f.uri)))() + defer slogext.DebugProfile(f.lsp.logger, slog.String("uri", string(f.uri)))() unlock := f.lock.Lock(ctx) defer unlock() @@ -326,7 +326,7 @@ func (f *file) IndexImports(ctx context.Context) { importable, err := f.lsp.findImportable(ctx, f.uri) if err != nil { - f.lsp.logger.Sugar().Warnf("could not compute importable files for %s: %s", f.uri, err) + f.lsp.logger.Warn(fmt.Sprintf("could not compute importable files for %s: %s", f.uri, err)) return } f.importableToImage = importable @@ -353,7 +353,7 @@ func (f *file) IndexImports(ctx context.Context) { name := node.Name.AsString() fileInfo, ok := importable[name] if !ok { - f.lsp.logger.Sugar().Warnf("could not find URI for import %q", name) + f.lsp.logger.Warn(fmt.Sprintf("could not find URI for import %q", name)) continue } @@ -393,8 +393,8 @@ func (f *file) IndexImports(ctx context.Context) { for _, file := range fileImports { if err := file.ReadFromDisk(ctx); err != nil { - file.lsp.logger.Sugar().Warnf("could not load import import %q from disk: %w", - file.uri, err) + file.lsp.logger.Warn(fmt.Sprintf("could not load import import %q from disk: %s", + file.uri, err.Error())) continue } @@ -481,7 +481,7 @@ func (f *file) BuildImage(ctx context.Context) { for i := 0; i < imports.Len(); i++ { dep := imports.Get(i).FileDescriptor if dep == nil { - f.lsp.logger.Sugar().Warnf("found nil FileDescriptor for import %s", imports.Get(i).Path()) + f.lsp.logger.Warn(fmt.Sprintf("found nil FileDescriptor for import %s", imports.Get(i).Path())) continue } @@ -516,17 +516,17 @@ func (f *file) BuildImage(ctx context.Context) { } imageFiles = append(imageFiles, imageFile) - f.lsp.logger.Sugar().Debugf("added image file for %s", descriptor.Path()) + f.lsp.logger.Debug(fmt.Sprintf("added image file for %s", descriptor.Path())) } if err != nil { - f.lsp.logger.Warn("could not build image", zap.String("uri", string(f.uri)), zap.Error(err)) + f.lsp.logger.Warn("could not build image", slog.String("uri", string(f.uri)), slogext.ErrorAttr(err)) return } image, err := bufimage.NewImage(imageFiles) if err != nil { - f.lsp.logger.Warn("could not build image", zap.String("uri", string(f.uri)), zap.Error(err)) + f.lsp.logger.Warn("could not build image", slog.String("uri", string(f.uri)), slogext.ErrorAttr(err)) return } @@ -551,11 +551,11 @@ func (f *file) RunLints(ctx context.Context) bool { f.lock.Unlock(ctx) if module == nil || image == nil { - f.lsp.logger.Sugar().Warnf("could not find image for %q", f.uri) + f.lsp.logger.Warn(fmt.Sprintf("could not find image for %q", f.uri)) return false } - f.lsp.logger.Sugar().Debugf("running lint for %q in %v", f.uri, module.ModuleFullName()) + f.lsp.logger.Debug(fmt.Sprintf("running lint for %q in %v", f.uri, module.ModuleFullName())) lintConfig := workspace.GetLintConfigForOpaqueID(module.OpaqueID()) err := f.lsp.checkClient.Lint( @@ -566,22 +566,22 @@ func (f *file) RunLints(ctx context.Context) bool { ) if err == nil { - f.lsp.logger.Sugar().Warnf("lint generated no errors for %s", f.uri) + f.lsp.logger.Warn(fmt.Sprintf("lint generated no errors for %s", f.uri)) return false } var annotations bufanalysis.FileAnnotationSet if !errors.As(err, &annotations) { - f.lsp.logger.Warn("error while linting", zap.String("uri", string(f.uri)), zap.Error(err)) + f.lsp.logger.Warn("error while linting", slog.String("uri", string(f.uri)), slogext.ErrorAttr(err)) return false } - f.lsp.logger.Sugar().Warnf("lint generated %d error(s) for %s", len(annotations.FileAnnotations()), f.uri) + f.lsp.logger.Warn(fmt.Sprintf("lint generated %d error(s) for %s", len(annotations.FileAnnotations()), f.uri)) f.lock.Lock(ctx) f.lock.Unlock(ctx) for _, annotation := range annotations.FileAnnotations() { - f.lsp.logger.Sugar().Info(annotation.FileInfo().Path(), " ", annotation.FileInfo().ExternalPath()) + f.lsp.logger.Info(annotation.FileInfo().Path(), " ", annotation.FileInfo().ExternalPath()) f.diagnostics = append(f.diagnostics, protocol.Diagnostic{ Range: protocol.Range{ @@ -606,7 +606,7 @@ func (f *file) RunLints(ctx context.Context) bool { // IndexSymbols processes the AST of a file and generates symbols for each symbol in // the document. func (f *file) IndexSymbols(ctx context.Context) { - defer zaputil.DebugProfile(f.lsp.logger, zap.String("uri", string(f.uri)))() + defer slogext.DebugProfile(f.lsp.logger, slog.String("uri", string(f.uri)))() unlock := f.lock.Lock(ctx) defer unlock() @@ -634,7 +634,7 @@ func (f *file) IndexSymbols(ctx context.Context) { symbol.ResolveCrossFile(ctx) } - f.lsp.logger.Sugar().Debugf("symbol indexing complete %s", f.uri) + f.lsp.logger.DebugContext(ctx, fmt.Sprintf("symbol indexing complete %s", f.uri)) } // SymbolAt finds a symbol in this file at the given cursor position, if one exists. @@ -656,7 +656,7 @@ func (f *file) SymbolAt(ctx context.Context, cursor protocol.Position) *symbol { } symbol := f.symbols[idx] - f.lsp.logger.Debug("found symbol", zap.Object("symbol", symbol)) + f.lsp.logger.DebugContext(ctx, "found symbol", slog.Any("symbol", symbol)) // Check that cursor is before the end of the symbol. if comparePositions(symbol.Range().End, cursor) <= 0 { diff --git a/private/buf/buflsp/jsonrpc_wrappers.go b/private/buf/buflsp/jsonrpc_wrappers.go index 7b13dfa1de..e600c97dbb 100644 --- a/private/buf/buflsp/jsonrpc_wrappers.go +++ b/private/buf/buflsp/jsonrpc_wrappers.go @@ -19,9 +19,10 @@ package buflsp import ( "context" + "log/slog" + "github.com/bufbuild/buf/private/pkg/slogext" "go.lsp.dev/jsonrpc2" - "go.uber.org/zap" ) // wrapReplier wraps a jsonrpc2.Replier, allowing us to inject logging and tracing and so on. @@ -30,14 +31,14 @@ func (l *lsp) wrapReplier(reply jsonrpc2.Replier, req jsonrpc2.Request) jsonrpc2 if err != nil { l.logger.Warn( "responding with error", - zap.String("method", req.Method()), - zap.Error(err), + slog.String("method", req.Method()), + slogext.ErrorAttr(err), ) } else { l.logger.Debug( "responding", - zap.String("method", req.Method()), - zap.Reflect("params", result), + slog.String("method", req.Method()), + slog.Any("params", result), ) } @@ -52,29 +53,29 @@ func (l *lsp) wrapReplier(reply jsonrpc2.Replier, req jsonrpc2.Request) jsonrpc2 type connWrapper struct { jsonrpc2.Conn - logger *zap.Logger + logger *slog.Logger } func (c *connWrapper) Call( ctx context.Context, method string, params, result any) (id jsonrpc2.ID, err error) { c.logger.Debug( "call", - zap.String("method", method), - zap.Reflect("params", params), + slog.String("method", method), + slog.Any("params", params), ) id, err = c.Conn.Call(ctx, method, params, result) if err != nil { c.logger.Warn( "call returned error", - zap.String("method", method), - zap.Error(err), + slog.String("method", method), + slogext.ErrorAttr(err), ) } else { c.logger.Warn( "call returned", - zap.String("method", method), - zap.Reflect("result", result), + slog.String("method", method), + slog.Any("result", result), ) } @@ -85,21 +86,21 @@ func (c *connWrapper) Notify( ctx context.Context, method string, params any) error { c.logger.Debug( "notify", - zap.String("method", method), - zap.Reflect("params", params), + slog.String("method", method), + slog.Any("params", params), ) err := c.Conn.Notify(ctx, method, params) if err != nil { c.logger.Warn( "notify returned error", - zap.String("method", method), - zap.Error(err), + slog.String("method", method), + slogext.ErrorAttr(err), ) } else { c.logger.Warn( "notify returned", - zap.String("method", method), + slog.String("method", method), ) } diff --git a/private/buf/buflsp/symbol.go b/private/buf/buflsp/symbol.go index 46bddee5ab..1bb7e3a84a 100644 --- a/private/buf/buflsp/symbol.go +++ b/private/buf/buflsp/symbol.go @@ -23,14 +23,13 @@ package buflsp import ( "context" "fmt" + "log/slog" "slices" "strings" "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/protocompile/ast" "go.lsp.dev/protocol" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) // symbol represents a named symbol inside of a buflsp.file @@ -164,9 +163,10 @@ func (s *symbol) ResolveCrossFile(ctx context.Context) { if kind.seeTypeOf != nil { ref, ok := kind.seeTypeOf.kind.(*reference) if !ok || ref.file == nil { - s.file.lsp.logger.Debug( + s.file.lsp.logger.DebugContext( + ctx, "unexpected unresolved or non-reference symbol for seeTypeOf", - zap.Object("symbol", s)) + slog.Any("symbol", s)) return } @@ -178,10 +178,11 @@ func (s *symbol) ResolveCrossFile(ctx context.Context) { // Find the definition that contains the type we want. def, node := kind.seeTypeOf.Definition(ctx) if def == nil { - s.file.lsp.logger.Debug( + s.file.lsp.logger.DebugContext( + ctx, "could not resolve dependent symbol definition", - zap.Object("symbol", s), - zap.Object("dep", kind.seeTypeOf)) + slog.Any("symbol", s), + slog.Any("dep", kind.seeTypeOf)) return } @@ -189,11 +190,12 @@ func (s *symbol) ResolveCrossFile(ctx context.Context) { // TODO: Support more exotic field types. field, ok := node.(*ast.FieldNode) if !ok { - s.file.lsp.logger.Debug( + s.file.lsp.logger.DebugContext( + ctx, "dependent symbol definition was not a field", - zap.Object("symbol", s), - zap.Object("dep", kind.seeTypeOf), - zap.Object("def", def)) + slog.Any("symbol", s), + slog.Any("dep", kind.seeTypeOf), + slog.Any("def", def)) return } @@ -205,11 +207,12 @@ func (s *symbol) ResolveCrossFile(ctx context.Context) { Character: uint32(info.Start().Col) - 1, }) if ty == nil { - s.file.lsp.logger.Debug( + s.file.lsp.logger.DebugContext( + ctx, "dependent symbol's field type didn't resolve", - zap.Object("symbol", s), - zap.Object("dep", kind.seeTypeOf), - zap.Object("def", def)) + slog.Any("symbol", s), + slog.Any("dep", kind.seeTypeOf), + slog.Any("def", def)) return } @@ -219,12 +222,13 @@ func (s *symbol) ResolveCrossFile(ctx context.Context) { // when we go to hover over the symbol. ref, ok = ty.kind.(*reference) if !ok || ty.file == nil { - s.file.lsp.logger.Debug( + s.file.lsp.logger.DebugContext( + ctx, "dependent symbol's field type didn't resolve to a reference", - zap.Object("symbol", s), - zap.Object("dep", kind.seeTypeOf), - zap.Object("def", def), - zap.Object("resolved", ty)) + slog.Any("symbol", s), + slog.Any("dep", kind.seeTypeOf), + slog.Any("def", def), + slog.Any("resolved", ty)) return } @@ -328,60 +332,7 @@ func (s *symbol) ResolveCrossFile(ctx context.Context) { } } -func (s *symbol) MarshalLogObject(enc zapcore.ObjectEncoder) (err error) { - enc.AddString("file", s.file.uri.Filename()) - - // zapPos converts an ast.SourcePos into a zap marshaller. - zapPos := func(pos ast.SourcePos) zapcore.ObjectMarshalerFunc { - return func(enc zapcore.ObjectEncoder) error { - enc.AddInt("offset", pos.Offset) - enc.AddInt("line", pos.Line) - enc.AddInt("col", pos.Col) - return nil - } - } - - err = enc.AddObject("start", zapPos(s.info.Start())) - if err != nil { - return err - } - - err = enc.AddObject("end", zapPos(s.info.End())) - if err != nil { - return err - } - - switch kind := s.kind.(type) { - case *builtin: - enc.AddString("builtin", kind.name) - - case *import_: - if kind.file != nil { - enc.AddString("imports", kind.file.uri.Filename()) - } - - case *definition: - enc.AddString("defines", strings.Join(kind.path, ".")) - - case *reference: - if kind.file != nil { - enc.AddString("imports", kind.file.uri.Filename()) - } - if kind.path != nil { - enc.AddString("references", strings.Join(kind.path, ".")) - } - if kind.seeTypeOf != nil { - err = enc.AddObject("see_type_of", kind.seeTypeOf) - if err != nil { - return err - } - } - } - - return nil -} - -// FormatDocs finds appropriate documentation for the given s and constructs a Markdown +// FormatDocs finds appropriate documgntation for the given s and constructs a Markdown // string for showing to the client. // // Returns the empty string if no docs are available. diff --git a/private/buf/bufmigrate/bufmigrate.go b/private/buf/bufmigrate/bufmigrate.go index 4ffc351d61..be63386b43 100644 --- a/private/buf/bufmigrate/bufmigrate.go +++ b/private/buf/bufmigrate/bufmigrate.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufconfig" "github.com/bufbuild/buf/private/bufpkg/bufmodule" @@ -25,7 +26,6 @@ import ( "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/syserror" - "go.uber.org/zap" ) // Migrator migrates buf configuration files. @@ -76,7 +76,7 @@ type Migrator interface { // NewMigrator returns a new Migrator. func NewMigrator( - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, moduleKeyProvider bufmodule.ModuleKeyProvider, commitProvider bufmodule.CommitProvider, diff --git a/private/buf/bufmigrate/migrate_builder.go b/private/buf/bufmigrate/migrate_builder.go index cae36f6465..3166039f72 100644 --- a/private/buf/bufmigrate/migrate_builder.go +++ b/private/buf/bufmigrate/migrate_builder.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufconfig" "github.com/bufbuild/buf/private/bufpkg/bufmodule" @@ -30,11 +31,10 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/google/uuid" "go.uber.org/multierr" - "go.uber.org/zap" ) type migrateBuilder struct { - logger *zap.Logger + logger *slog.Logger runner command.Runner commitProvider bufmodule.CommitProvider bucket storage.ReadBucket @@ -54,7 +54,7 @@ type migrateBuilder struct { } func newMigrateBuilder( - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, commitProvider bufmodule.CommitProvider, bucket storage.ReadBucket, @@ -100,19 +100,19 @@ func (m *migrateBuilder) addBufGenYAML(ctx context.Context, bufGenYAMLFilePath s return err } if bufGenYAML.FileVersion() == bufconfig.FileVersionV2 { - m.logger.Sugar().Warnf("%s is a v2 file, no migration required", bufGenYAMLFilePath) + m.logger.Warn(fmt.Sprintf("%s is a v2 file, no migration required", bufGenYAMLFilePath)) return nil } if typeConfig := bufGenYAML.GenerateConfig().GenerateTypeConfig(); typeConfig != nil && len(typeConfig.IncludeTypes()) > 0 { // TODO FUTURE: what does this sentence mean? Get someone else to read it and understand it without any explanation. - m.logger.Sugar().Warnf( + m.logger.Warn(fmt.Sprintf( "%s is a v1 generation template with a top-level 'types' section including %s. In a v2 generation template, 'types' can"+ " only exist within an input in the 'inputs' section. Since the migration command does not have information"+ " on inputs, the migrated generation will not have an 'inputs' section. To add these types in the migrated file, you can"+ " first add an input to 'inputs' and then add these types to the input.", bufGenYAMLFilePath, stringutil.SliceToHumanString(typeConfig.IncludeTypes()), - ) + )) } // No special transformation needed, writeBufGenYAMLFile handles it correctly. migratedBufGenYAMLFile := bufconfig.NewBufGenYAMLFile( @@ -250,11 +250,11 @@ func (m *migrateBuilder) addModule(ctx context.Context, moduleDirPath string) (r // but they should not share the same module name. Instead we just give // them empty module names. if len(moduleConfig.RootToExcludes()) > 1 && moduleFullName != nil { - m.logger.Sugar().Warnf( + m.logger.Warn(fmt.Sprintf( "%s has name %s and multiple roots. These roots are now separate unnamed modules.", bufYAMLFilePath, moduleFullName.String(), - ) + )) moduleFullName = nil } // Each root in buf.yaml v1beta1 should become its own module config in v2, @@ -330,7 +330,7 @@ func (m *migrateBuilder) addModule(ctx context.Context, moduleDirPath string) (r } m.configuredDepModuleRefs = append(m.configuredDepModuleRefs, bufYAMLFile.ConfiguredDepModuleRefs()...) case bufconfig.FileVersionV2: - m.logger.Sugar().Warnf("%s is a v2 file, no migration required", bufYAMLFilePath) + m.logger.Warn(fmt.Sprintf("%s is a v2 file, no migration required", bufYAMLFilePath)) return nil default: return syserror.Newf("unexpected version: %v", bufYAMLFile.FileVersion()) @@ -377,7 +377,7 @@ func (m *migrateBuilder) addModule(ctx context.Context, moduleDirPath string) (r case bufconfig.FileVersionV1Beta1, bufconfig.FileVersionV1: m.depModuleKeys = append(m.depModuleKeys, bufLockFile.DepModuleKeys()...) case bufconfig.FileVersionV2: - m.logger.Sugar().Warnf("%s is a v2 file, no migration required", bufLockFilePath) + m.logger.Warn(fmt.Sprintf("%s is a v2 file, no migration required", bufLockFilePath)) return nil default: return syserror.Newf("unrecognized version: %v", bufLockFile.FileVersion()) diff --git a/private/buf/bufmigrate/migrator.go b/private/buf/bufmigrate/migrator.go index 99de435c31..37d38bf5e9 100644 --- a/private/buf/bufmigrate/migrator.go +++ b/private/buf/bufmigrate/migrator.go @@ -17,8 +17,10 @@ package bufmigrate import ( "context" "errors" + "fmt" "io" "io/fs" + "log/slog" "sort" "strings" @@ -34,18 +36,17 @@ import ( "github.com/bufbuild/buf/private/pkg/wasm" "github.com/google/uuid" "go.uber.org/multierr" - "go.uber.org/zap" ) type migrator struct { - logger *zap.Logger + logger *slog.Logger runner command.Runner moduleKeyProvider bufmodule.ModuleKeyProvider commitProvider bufmodule.CommitProvider } func newMigrator( - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, moduleKeyProvider bufmodule.ModuleKeyProvider, commitProvider bufmodule.CommitProvider, @@ -95,13 +96,13 @@ func (m *migrator) logPaths( bufGenYAMLFilePaths []string, ) { if len(workspaceDirPaths) > 0 { - m.logger.Sugar().Debugf("workspace directory paths:\n%s", strings.Join(workspaceDirPaths, "\n")) + m.logger.Debug(fmt.Sprintf("workspace directory paths:\n%s", strings.Join(workspaceDirPaths, "\n"))) } if len(moduleDirPaths) > 0 { - m.logger.Sugar().Debugf("module directory paths:\n%s", strings.Join(moduleDirPaths, "\n")) + m.logger.Debug(fmt.Sprintf("module directory paths:\n%s", strings.Join(moduleDirPaths, "\n"))) } if len(bufGenYAMLFilePaths) > 0 { - m.logger.Sugar().Debugf("buf.gen.yaml file paths:\n%s", strings.Join(bufGenYAMLFilePaths, "\n")) + m.logger.Debug(fmt.Sprintf("buf.gen.yaml file paths:\n%s", strings.Join(bufGenYAMLFilePaths, "\n"))) } } @@ -645,7 +646,7 @@ func resolvedDeclaredAndLockedDependencies( func equivalentLintConfigInV2( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, lintConfig bufconfig.LintConfig, ) (bufconfig.LintConfig, error) { @@ -672,7 +673,7 @@ func equivalentLintConfigInV2( func equivalentBreakingConfigInV2( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, breakingConfig bufconfig.BreakingConfig, ) (bufconfig.BreakingConfig, error) { @@ -696,7 +697,7 @@ func equivalentBreakingConfigInV2( // list of rules and categories specified. func equivalentCheckConfigInV2( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, ruleType check.RuleType, checkConfig bufconfig.CheckConfig, diff --git a/private/buf/bufprotoc/bufprotoc.go b/private/buf/bufprotoc/bufprotoc.go index bb22c74bbc..a68b89ccad 100644 --- a/private/buf/bufprotoc/bufprotoc.go +++ b/private/buf/bufprotoc/bufprotoc.go @@ -18,6 +18,7 @@ package bufprotoc import ( "context" "fmt" + "log/slog" "sort" "github.com/bufbuild/buf/private/bufpkg/bufmodule" @@ -26,7 +27,6 @@ import ( "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/stringutil" - "go.uber.org/zap" ) // NewModuleSetForProtoc returns a new ModuleSet for protoc -I dirPaths and filePaths. @@ -38,7 +38,7 @@ import ( // that is banned in protoc. func NewModuleSetForProtoc( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, includeDirPaths []string, filePaths []string, diff --git a/private/buf/bufprotoc/bufprotoc_test.go b/private/buf/bufprotoc/bufprotoc_test.go index d0acea2e55..103c035e3c 100644 --- a/private/buf/bufprotoc/bufprotoc_test.go +++ b/private/buf/bufprotoc/bufprotoc_test.go @@ -18,9 +18,9 @@ import ( "context" "testing" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestNewModuleSetForProtoc(t *testing.T) { @@ -30,7 +30,7 @@ func TestNewModuleSetForProtoc(t *testing.T) { moduleSet, err := NewModuleSetForProtoc( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), storageos.NewProvider(), []string{ "testdata/basic/bsr/buf.testing/acme/date", diff --git a/private/buf/bufprotopluginexec/binary_handler.go b/private/buf/bufprotopluginexec/binary_handler.go index 140d3690c4..c617a5da29 100644 --- a/private/buf/bufprotopluginexec/binary_handler.go +++ b/private/buf/bufprotopluginexec/binary_handler.go @@ -18,26 +18,26 @@ import ( "bytes" "context" "io" + "log/slog" "path/filepath" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/ioext" "github.com/bufbuild/buf/private/pkg/protoencoding" - "github.com/bufbuild/buf/private/pkg/zaputil" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/protoplugin" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) type binaryHandler struct { - logger *zap.Logger + logger *slog.Logger runner command.Runner pluginPath string pluginArgs []string } func newBinaryHandler( - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, pluginPath string, pluginArgs []string, @@ -56,7 +56,7 @@ func (h *binaryHandler) Handle( responseWriter protoplugin.ResponseWriter, request protoplugin.Request, ) (retErr error) { - defer zaputil.DebugProfile(h.logger, zap.String("plugin", filepath.Base(h.pluginPath)))() + defer slogext.DebugProfile(h.logger, slog.String("plugin", filepath.Base(h.pluginPath)))() requestData, err := protoencoding.NewWireMarshaler().Marshal(request.CodeGeneratorRequest()) if err != nil { diff --git a/private/buf/bufprotopluginexec/bufprotopluginexec.go b/private/buf/bufprotopluginexec/bufprotopluginexec.go index b102f69697..c81ad755f3 100644 --- a/private/buf/bufprotopluginexec/bufprotopluginexec.go +++ b/private/buf/bufprotopluginexec/bufprotopluginexec.go @@ -22,6 +22,7 @@ import ( "context" "errors" "fmt" + "log/slog" "os/exec" "github.com/bufbuild/buf/private/bufpkg/bufconfig" @@ -29,7 +30,6 @@ import ( "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/protoplugin" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) @@ -75,7 +75,7 @@ type Generator interface { // NewGenerator returns a new Generator. func NewGenerator( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, ) Generator { @@ -112,7 +112,7 @@ func GenerateWithProtocPath(protocPath ...string) GenerateOption { // - Else, if the name is in ProtocProxyPluginNames, this returns a new protoc proxy handler. // - Else, this returns error. func NewHandler( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, pluginName string, @@ -180,7 +180,7 @@ func HandlerWithPluginPath(pluginPath ...string) HandlerOption { // NewBinaryHandler returns a new Handler that invokes the specific plugin // specified by pluginPath. -func NewBinaryHandler(logger *zap.Logger, runner command.Runner, pluginPath string, pluginArgs []string) (protoplugin.Handler, error) { +func NewBinaryHandler(logger *slog.Logger, runner command.Runner, pluginPath string, pluginArgs []string) (protoplugin.Handler, error) { pluginPath, err := unsafeLookPath(pluginPath) if err != nil { return nil, err diff --git a/private/buf/bufprotopluginexec/generator.go b/private/buf/bufprotopluginexec/generator.go index 22d8aa93bb..1aec1a244f 100644 --- a/private/buf/bufprotopluginexec/generator.go +++ b/private/buf/bufprotopluginexec/generator.go @@ -16,23 +16,23 @@ package bufprotopluginexec import ( "context" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufprotoplugin" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) type generator struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider runner command.Runner } func newGenerator( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, ) *generator { diff --git a/private/buf/bufprotopluginexec/protoc_proxy_handler.go b/private/buf/bufprotopluginexec/protoc_proxy_handler.go index 5e0f245f44..973ee17096 100644 --- a/private/buf/bufprotopluginexec/protoc_proxy_handler.go +++ b/private/buf/bufprotopluginexec/protoc_proxy_handler.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "io" + "log/slog" "path/filepath" "strings" @@ -28,19 +29,18 @@ import ( "github.com/bufbuild/buf/private/pkg/ioext" "github.com/bufbuild/buf/private/pkg/protoencoding" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/tmp" - "github.com/bufbuild/buf/private/pkg/zaputil" "github.com/bufbuild/protoplugin" "go.uber.org/multierr" - "go.uber.org/zap" "google.golang.org/protobuf/types/descriptorpb" "google.golang.org/protobuf/types/pluginpb" ) type protocProxyHandler struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider runner command.Runner protocPath string @@ -49,7 +49,7 @@ type protocProxyHandler struct { } func newProtocProxyHandler( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, protocPath string, @@ -72,7 +72,7 @@ func (h *protocProxyHandler) Handle( responseWriter protoplugin.ResponseWriter, request protoplugin.Request, ) (retErr error) { - defer zaputil.DebugProfile(h.logger, zap.String("plugin", filepath.Base(h.pluginName)))() + defer slogext.DebugProfile(h.logger, slog.String("plugin", filepath.Base(h.pluginName)))() // We should send the complete FileDescriptorSet with source-retention options to --descriptor_set_in. // diff --git a/private/buf/bufstudioagent/bufstudioagent.go b/private/buf/bufstudioagent/bufstudioagent.go index eb229f8154..8187facfd7 100644 --- a/private/buf/bufstudioagent/bufstudioagent.go +++ b/private/buf/bufstudioagent/bufstudioagent.go @@ -16,16 +16,16 @@ package bufstudioagent import ( "crypto/tls" + "log/slog" "net/http" "github.com/rs/cors" - "go.uber.org/zap" ) // NewHandler creates a new handler that serves the invoke endpoints for the // agent. func NewHandler( - logger *zap.Logger, + logger *slog.Logger, origin string, tlsClientConfig *tls.Config, disallowedHeaders map[string]struct{}, diff --git a/private/buf/bufstudioagent/bufstudioagent_test.go b/private/buf/bufstudioagent/bufstudioagent_test.go index 8bb61b8459..4928b44161 100644 --- a/private/buf/bufstudioagent/bufstudioagent_test.go +++ b/private/buf/bufstudioagent/bufstudioagent_test.go @@ -31,9 +31,10 @@ import ( "connectrpc.com/connect" studiov1alpha1 "github.com/bufbuild/buf/private/gen/proto/go/buf/alpha/studio/v1alpha1" "github.com/bufbuild/buf/private/pkg/protoencoding" + "github.com/bufbuild/buf/private/pkg/slogext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap/zaptest" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "google.golang.org/protobuf/proto" @@ -61,7 +62,7 @@ func TestPlainPostHandlerH2C(t *testing.T) { func testPlainPostHandler(t *testing.T, upstreamServer *httptest.Server) { agentServer := httptest.NewTLSServer( NewHandler( - zaptest.NewLogger(t), + slogtestext.NewLogger(t), "https://example.buf.build", upstreamServer.TLS, nil, @@ -139,7 +140,7 @@ func testPlainPostHandler(t *testing.T, upstreamServer *httptest.Server) { func testPlainPostHandlerErrors(t *testing.T, upstreamServer *httptest.Server) { agentServer := httptest.NewTLSServer( NewHandler( - zaptest.NewLogger(t), + slogext.NopLogger, "https://example.buf.build", upstreamServer.TLS, map[string]struct{}{"forbidden-header": {}}, diff --git a/private/buf/bufstudioagent/plain_post_handler.go b/private/buf/bufstudioagent/plain_post_handler.go index 215cefd491..c1672f1ce7 100644 --- a/private/buf/bufstudioagent/plain_post_handler.go +++ b/private/buf/bufstudioagent/plain_post_handler.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io" + "log/slog" "net" "net/http" "net/textproto" @@ -29,7 +30,7 @@ import ( "connectrpc.com/connect" studiov1alpha1 "github.com/bufbuild/buf/private/gen/proto/go/buf/alpha/studio/v1alpha1" "github.com/bufbuild/buf/private/pkg/protoencoding" - "go.uber.org/zap" + "github.com/bufbuild/buf/private/pkg/slogext" "golang.org/x/net/http2" "google.golang.org/protobuf/proto" ) @@ -50,7 +51,7 @@ const MaxMessageSizeBytesDefault = 1024 * 1024 * 5 // // [1] https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). type plainPostHandler struct { - Logger *zap.Logger + Logger *slog.Logger MaxMessageSizeBytes int64 B64Encoding *base64.Encoding TLSClient *http.Client @@ -60,7 +61,7 @@ type plainPostHandler struct { } func newPlainPostHandler( - logger *zap.Logger, + logger *slog.Logger, disallowedHeaders map[string]struct{}, forwardHeaders map[string]string, tlsClientConfig *tls.Config, @@ -201,7 +202,7 @@ func (i *plainPostHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } i.Logger.Warn( "non_connect_unary_error", - zap.Error(err), + slogext.ErrorAttr(err), ) http.Error(w, err.Error(), http.StatusBadGateway) return @@ -250,9 +251,9 @@ func (i *plainPostHandler) writeProtoMessage(w http.ResponseWriter, message prot if n, err := w.Write(responseB64Bytes); n != len(responseB64Bytes) && err != nil { i.Logger.Error( "write_error", - zap.Int("expected_bytes", len(responseB64Bytes)), - zap.Int("actual_bytes", n), - zap.Error(err), + slog.Int("expected_bytes", len(responseB64Bytes)), + slog.Int("actual_bytes", n), + slogext.ErrorAttr(err), ) } } diff --git a/private/buf/buftarget/bucket_targeting.go b/private/buf/buftarget/bucket_targeting.go index c1ad43ea0f..564bf70488 100644 --- a/private/buf/buftarget/bucket_targeting.go +++ b/private/buf/buftarget/bucket_targeting.go @@ -16,10 +16,10 @@ package buftarget import ( "context" + "log/slog" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/storage" - "go.uber.org/zap" ) // BucketTargeting provides targeting information for the bucket based on any controlling @@ -52,7 +52,7 @@ type BucketTargeting interface { // Otherwise, the input dir, target paths, and target exclude paths are returned as-is. func NewBucketTargeting( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadBucket, subDirPath string, targetPaths []string, @@ -83,7 +83,7 @@ type bucketTargeting struct { func newBucketTargeting( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadBucket, subDirPath string, targetPaths []string, @@ -161,7 +161,7 @@ func (*bucketTargeting) isBucketTargeting() {} // controlling workspace and mapped path. func mapControllingWorkspaceAndPath( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadBucket, path string, terminateFunc TerminateFunc, @@ -190,10 +190,11 @@ func mapControllingWorkspaceAndPath( return nil, "", err } if controllingWorkspace != nil { - logger.Debug( + logger.DebugContext( + ctx, "buffetch termination found", - zap.String("curDirPath", curDirPath), - zap.String("path", path), + slog.String("curDirPath", curDirPath), + slog.String("path", path), ) subDirPath, err := normalpath.Rel(curDirPath, path) if err != nil { @@ -206,9 +207,10 @@ func mapControllingWorkspaceAndPath( } curDirPath = normalpath.Dir(curDirPath) } - logger.Debug( + logger.DebugContext( + ctx, "buffetch no termination found", - zap.String("path", path), + slog.String("path", path), ) // No controlling workspace is found, we simply return the input dir return nil, path, nil diff --git a/private/buf/buftesting/buftesting.go b/private/buf/buftesting/buftesting.go index 8e492429d2..1942e1ca3b 100644 --- a/private/buf/buftesting/buftesting.go +++ b/private/buf/buftesting/buftesting.go @@ -28,9 +28,9 @@ import ( "github.com/bufbuild/buf/private/pkg/github/githubtesting" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/prototesting" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/require" - "go.uber.org/zap" "google.golang.org/protobuf/types/descriptorpb" ) @@ -49,7 +49,7 @@ var ( } testStorageosProvider = storageos.NewProvider(storageos.ProviderWithSymlinks()) testArchiveReader = githubtesting.NewArchiveReader( - zap.NewNop(), + slogext.NopLogger, testStorageosProvider, testHTTPClient, ) @@ -135,7 +135,7 @@ func GetProtocFilePathsErr(ctx context.Context, dirPath string, limit int) ([]st // impact on our dependency tree. moduleSet, err := bufprotoc.NewModuleSetForProtoc( ctx, - zap.NewNop(), + slogext.NopLogger, testStorageosProvider, []string{dirPath}, nil, diff --git a/private/buf/bufwkt/bufwktstore/bufwktstore.go b/private/buf/bufwkt/bufwktstore/bufwktstore.go index db144b6a42..d0f5dc597f 100644 --- a/private/buf/bufwkt/bufwktstore/bufwktstore.go +++ b/private/buf/bufwkt/bufwktstore/bufwktstore.go @@ -16,10 +16,10 @@ package bufwktstore import ( "context" + "log/slog" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/storage" - "go.uber.org/zap" ) // Store provides disk-backed WKT buckets. @@ -34,7 +34,7 @@ type Store interface { // // It is assumed that the Store has complete control of the bucket. func NewStore( - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, bucket storage.ReadWriteBucket, ) Store { diff --git a/private/buf/bufwkt/bufwktstore/store.go b/private/buf/bufwkt/bufwktstore/store.go index d6cef2ed43..926fb6a9db 100644 --- a/private/buf/bufwkt/bufwktstore/store.go +++ b/private/buf/bufwkt/bufwktstore/store.go @@ -16,21 +16,21 @@ package bufwktstore import ( "context" + "log/slog" "github.com/bufbuild/buf/private/gen/data/datawkt" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/storage" - "go.uber.org/zap" ) type store struct { - logger *zap.Logger + logger *slog.Logger runner command.Runner bucket storage.ReadWriteBucket } func newStore( - logger *zap.Logger, + logger *slog.Logger, runner command.Runner, bucket storage.ReadWriteBucket, ) *store { diff --git a/private/buf/bufwkt/cmd/wkt-go-data/main.go b/private/buf/bufwkt/cmd/wkt-go-data/main.go index db6ef94960..f26d29be64 100644 --- a/private/buf/bufwkt/cmd/wkt-go-data/main.go +++ b/private/buf/bufwkt/cmd/wkt-go-data/main.go @@ -35,6 +35,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appcmd" "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/spf13/pflag" @@ -56,7 +57,10 @@ func main() { func newCommand() *appcmd.Command { flags := newFlags() - builder := appext.NewBuilder(programName) + builder := appext.NewBuilder( + programName, + appext.BuilderWithLoggerProvider(slogapp.LoggerProvider), + ) return &appcmd.Command{ Use: fmt.Sprintf("%s path/to/google/protobuf/include", programName), Args: appcmd.ExactArgs(1), diff --git a/private/buf/bufworkspace/workspace_dep_manager_provider.go b/private/buf/bufworkspace/workspace_dep_manager_provider.go index 36de25d302..b5da4d846c 100644 --- a/private/buf/bufworkspace/workspace_dep_manager_provider.go +++ b/private/buf/bufworkspace/workspace_dep_manager_provider.go @@ -16,11 +16,11 @@ package bufworkspace import ( "context" + "log/slog" "github.com/bufbuild/buf/private/buf/buftarget" "github.com/bufbuild/buf/private/bufpkg/bufconfig" "github.com/bufbuild/buf/private/pkg/storage" - "go.uber.org/zap" ) // WorkspaceDepManagerProvider provides WorkspaceDepManagers. @@ -48,7 +48,7 @@ type WorkspaceDepManagerProvider interface { // NewWorkspaceDepManagerProvider returns a new WorkspaceDepManagerProvider. func NewWorkspaceDepManagerProvider( - logger *zap.Logger, + logger *slog.Logger, ) WorkspaceDepManagerProvider { return newWorkspaceDepManagerProvider( logger, @@ -58,11 +58,11 @@ func NewWorkspaceDepManagerProvider( // *** PRIVATE *** type workspaceDepManagerProvider struct { - logger *zap.Logger + logger *slog.Logger } func newWorkspaceDepManagerProvider( - logger *zap.Logger, + logger *slog.Logger, ) *workspaceDepManagerProvider { return &workspaceDepManagerProvider{ logger: logger, diff --git a/private/buf/bufworkspace/workspace_provider.go b/private/buf/bufworkspace/workspace_provider.go index 6f31093709..ca3f881afe 100644 --- a/private/buf/bufworkspace/workspace_provider.go +++ b/private/buf/bufworkspace/workspace_provider.go @@ -19,18 +19,18 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "github.com/bufbuild/buf/private/buf/buftarget" "github.com/bufbuild/buf/private/bufpkg/bufconfig" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/bufbuild/buf/private/pkg/syserror" - "github.com/bufbuild/buf/private/pkg/zaputil" "github.com/google/uuid" - "go.uber.org/zap" ) // WorkspaceProvider provides Workspaces and UpdateableWorkspaces. @@ -72,7 +72,7 @@ type WorkspaceProvider interface { // NewWorkspaceProvider returns a new WorkspaceProvider. func NewWorkspaceProvider( - logger *zap.Logger, + logger *slog.Logger, graphProvider bufmodule.GraphProvider, moduleDataProvider bufmodule.ModuleDataProvider, commitProvider bufmodule.CommitProvider, @@ -88,14 +88,14 @@ func NewWorkspaceProvider( // *** PRIVATE *** type workspaceProvider struct { - logger *zap.Logger + logger *slog.Logger graphProvider bufmodule.GraphProvider moduleDataProvider bufmodule.ModuleDataProvider commitProvider bufmodule.CommitProvider } func newWorkspaceProvider( - logger *zap.Logger, + logger *slog.Logger, graphProvider bufmodule.GraphProvider, moduleDataProvider bufmodule.ModuleDataProvider, commitProvider bufmodule.CommitProvider, @@ -113,7 +113,7 @@ func (w *workspaceProvider) GetWorkspaceForModuleKey( moduleKey bufmodule.ModuleKey, options ...WorkspaceModuleKeyOption, ) (Workspace, error) { - defer zaputil.DebugProfile(w.logger)() + defer slogext.DebugProfile(w.logger)() config, err := newWorkspaceModuleKeyConfig(options) if err != nil { @@ -219,7 +219,7 @@ func (w *workspaceProvider) GetWorkspaceForBucket( bucketTargeting buftarget.BucketTargeting, options ...WorkspaceBucketOption, ) (Workspace, error) { - defer zaputil.DebugProfile(w.logger)() + defer slogext.DebugProfile(w.logger)() config, err := newWorkspaceBucketConfig(options) if err != nil { return nil, err diff --git a/private/buf/bufworkspace/workspace_targeting.go b/private/buf/bufworkspace/workspace_targeting.go index 9c6e0c5820..a9b2b90ca9 100644 --- a/private/buf/bufworkspace/workspace_targeting.go +++ b/private/buf/bufworkspace/workspace_targeting.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "path/filepath" "github.com/bufbuild/buf/private/buf/buftarget" @@ -28,7 +29,6 @@ import ( "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/syserror" - "go.uber.org/zap" ) // workspaceTargeting figures out if we are working with a v1 or v2 workspace based on @@ -72,7 +72,7 @@ type moduleBucketAndModuleTargeting struct { func newWorkspaceTargeting( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, config *workspaceBucketConfig, bucket storage.ReadBucket, bucketTargeting buftarget.BucketTargeting, @@ -83,9 +83,10 @@ func newWorkspaceTargeting( return nil, err } if overrideBufYAMLFile != nil { - logger.Debug( + logger.DebugContext( + ctx, "targeting workspace with config override", - zap.String("subDirPath", bucketTargeting.SubDirPath()), + slog.String("subDirPath", bucketTargeting.SubDirPath()), ) switch fileVersion := overrideBufYAMLFile.FileVersion(); fileVersion { case bufconfig.FileVersionV1Beta1, bufconfig.FileVersionV1: @@ -116,9 +117,10 @@ func newWorkspaceTargeting( if controllingWorkspace := bucketTargeting.ControllingWorkspace(); controllingWorkspace != nil { // This is a v2 workspace. if controllingWorkspace.BufYAMLFile() != nil { - logger.Debug( + logger.DebugContext( + ctx, "targeting workspace based on v2 buf.yaml", - zap.String("subDirPath", bucketTargeting.SubDirPath()), + slog.String("subDirPath", bucketTargeting.SubDirPath()), ) return v2WorkspaceTargeting( ctx, @@ -144,9 +146,10 @@ defined with a v2 buf.yaml can be updated, see the migration documentation for m } // We targeted a specific module within the workspace. Based on the option we provided, we're going to ignore // the workspace entirely, and just act as if the buf.work.yaml did not exist. - logger.Debug( + logger.DebugContext( + ctx, "targeting workspace, ignoring v1 buf.work.yaml, just building on module at target", - zap.String("subDirPath", bucketTargeting.SubDirPath()), + slog.String("subDirPath", bucketTargeting.SubDirPath()), ) return v1WorkspaceTargeting( ctx, @@ -167,9 +170,10 @@ defined with a v2 buf.yaml can be updated, see the migration documentation for m ) } } - logger.Debug( + logger.DebugContext( + ctx, "targeting workspace with no found buf.work.yaml or v2 buf.yaml", - zap.String("subDirPath", bucketTargeting.SubDirPath()), + slog.String("subDirPath", bucketTargeting.SubDirPath()), ) // We did not find any buf.work.yaml or v2 buf.yaml, we invoke fallback logic. return fallbackWorkspaceTargeting( @@ -397,7 +401,7 @@ func v1WorkspaceTargeting( // 3. In the case where we find nothing, we set the input as a v1 module in a v1 workspace. func fallbackWorkspaceTargeting( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, config *workspaceBucketConfig, bucket storage.ReadBucket, bucketTargeting buftarget.BucketTargeting, @@ -732,7 +736,7 @@ func getModuleConfigAndConfiguredDepModuleRefsV1Beta1OrV1( // nice to be able to isolate this as fallback logic here. func checkForControllingWorkspaceOrV1Module( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadBucket, path string, ignoreWorkspaceCheck bool, @@ -763,10 +767,11 @@ func checkForControllingWorkspaceOrV1Module( return nil, err } if controllingWorkspace != nil { - logger.Debug( + logger.DebugContext( + ctx, "buffetch termination found", - zap.String("curDirPath", curDirPath), - zap.String("path", path), + slog.String("curDirPath", curDirPath), + slog.String("path", path), ) return controllingWorkspace, nil } @@ -787,9 +792,10 @@ func checkForControllingWorkspaceOrV1Module( } curDirPath = normalpath.Dir(curDirPath) } - logger.Debug( + logger.DebugContext( + ctx, "buffetch no termination found", - zap.String("path", path), + slog.String("path", path), ) return fallbackV1Module, nil } diff --git a/private/buf/bufworkspace/workspace_test.go b/private/buf/bufworkspace/workspace_test.go index 258c3bb88a..3cf3451deb 100644 --- a/private/buf/bufworkspace/workspace_test.go +++ b/private/buf/bufworkspace/workspace_test.go @@ -28,11 +28,10 @@ import ( "github.com/bufbuild/buf/private/pkg/ioext" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest" ) func TestBasicV1(t *testing.T) { @@ -67,7 +66,7 @@ func testBasic(t *testing.T, subDirPath string, isV2 bool) { bucketTargeting, err := buftarget.NewBucketTargeting( ctx, - zaptest.NewLogger(t), + slogtestext.NewLogger(t), bucket, "finance/portfolio/proto", nil, @@ -161,7 +160,7 @@ func testBasic(t *testing.T, subDirPath string, isV2 bool) { bucketTargeting, err = buftarget.NewBucketTargeting( ctx, - zaptest.NewLogger(t), + slogtestext.NewLogger(t), bucket, "common/money/proto", []string{"common/money/proto/acme/money/v1/currency_code.proto"}, @@ -219,7 +218,7 @@ func TestUnusedDep(t *testing.T) { require.NoError(t, err) bucketTargeting, err := buftarget.NewBucketTargeting( ctx, - zaptest.NewLogger(t), + slogtestext.NewLogger(t), bucket, ".", nil, @@ -269,7 +268,7 @@ func TestDuplicatePath(t *testing.T) { require.NoError(t, err) bucketTargeting, err := buftarget.NewBucketTargeting( ctx, - zaptest.NewLogger(t), + slogtestext.NewLogger(t), bucket, ".", nil, @@ -318,7 +317,7 @@ func testNewWorkspaceProvider(t *testing.T, testModuleDatas ...bufmoduletesting. bsrProvider, err := bufmoduletesting.NewOmniProvider(testModuleDatas...) require.NoError(t, err) return NewWorkspaceProvider( - zap.NewNop(), + slogtestext.NewLogger(t), bsrProvider, bsrProvider, bsrProvider, diff --git a/private/buf/cmd/buf/buf.go b/private/buf/cmd/buf/buf.go index bf97cec042..8094965342 100644 --- a/private/buf/cmd/buf/buf.go +++ b/private/buf/cmd/buf/buf.go @@ -90,6 +90,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/app/appcmd" "github.com/bufbuild/buf/private/pkg/app/appext" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/bufbuild/buf/private/pkg/syserror" ) @@ -106,6 +107,7 @@ func NewRootCommand(name string) *appcmd.Command { name, appext.BuilderWithTimeout(120*time.Second), appext.BuilderWithInterceptor(newErrorInterceptor()), + appext.BuilderWithLoggerProvider(slogapp.LoggerProvider), ) return &appcmd.Command{ Use: name, diff --git a/private/buf/cmd/buf/buf_test.go b/private/buf/cmd/buf/buf_test.go index 9f5e2d33c8..18fe6e26c8 100644 --- a/private/buf/cmd/buf/buf_test.go +++ b/private/buf/cmd/buf/buf_test.go @@ -42,12 +42,12 @@ import ( "github.com/bufbuild/buf/private/pkg/osext" "github.com/bufbuild/buf/private/pkg/protoencoding" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/storage/storagetesting" "github.com/bufbuild/buf/private/pkg/wasm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) var ( @@ -1349,7 +1349,7 @@ func TestCheckLsBreakingRulesFromConfigExceptDeprecated(t *testing.T) { t.Run(version.String(), func(t *testing.T) { t.Parallel() // Do not need any custom lint/breaking plugins here. - client, err := bufcheck.NewClient(zap.NewNop(), bufcheck.NewRunnerProvider(command.NewRunner(), wasm.UnimplementedRuntime)) + client, err := bufcheck.NewClient(slogtestext.NewLogger(t), bufcheck.NewRunnerProvider(command.NewRunner(), wasm.UnimplementedRuntime)) require.NoError(t, err) allRules, err := client.AllRules(context.Background(), check.RuleTypeBreaking, version) require.NoError(t, err) diff --git a/private/buf/cmd/buf/command/alpha/protoc/plugin.go b/private/buf/cmd/buf/command/alpha/protoc/plugin.go index 739507472c..56501842cc 100644 --- a/private/buf/cmd/buf/command/alpha/protoc/plugin.go +++ b/private/buf/cmd/buf/command/alpha/protoc/plugin.go @@ -17,6 +17,7 @@ package protoc import ( "context" "fmt" + "log/slog" "strings" "github.com/bufbuild/buf/private/buf/bufprotopluginexec" @@ -24,7 +25,6 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) @@ -43,7 +43,7 @@ func newPluginInfo() *pluginInfo { func executePlugin( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, container app.EnvStderrContainer, diff --git a/private/buf/cmd/buf/command/alpha/protoc/protoc.go b/private/buf/cmd/buf/command/alpha/protoc/protoc.go index e3a4482480..20e78c18f4 100644 --- a/private/buf/cmd/buf/command/alpha/protoc/protoc.go +++ b/private/buf/cmd/buf/command/alpha/protoc/protoc.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "log/slog" "strings" "github.com/bufbuild/buf/private/buf/bufcli" @@ -34,10 +35,8 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appcmd" "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/command" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "github.com/bufbuild/buf/private/pkg/zaputil" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) // NewCommand returns a new Command. @@ -90,7 +89,7 @@ func run( ) (retErr error) { runner := command.NewRunner() logger := container.Logger() - defer zaputil.DebugProfile(logger)() + defer slogext.DebugProfile(logger)() if env.PrintFreeFieldNumbers && len(env.PluginNameToPluginInfo) > 0 { return fmt.Errorf("cannot call --%s and plugins at the same time", printFreeFieldNumbersFlagName) @@ -102,12 +101,12 @@ func run( return fmt.Errorf("cannot call --%s and plugins at the same time", outputFlagName) } - if checkedEntry := logger.Check(zapcore.DebugLevel, "env"); checkedEntry != nil { - checkedEntry.Write( - zap.Any("flags", env.flags), - zap.Any("plugins", env.PluginNameToPluginInfo), - ) - } + logger.DebugContext( + ctx, + "env", + slog.Any("flags", env.flags), + slog.Any("plugins", env.PluginNameToPluginInfo), + ) storageosProvider := storageos.NewProvider(storageos.ProviderWithSymlinks()) moduleSet, err := bufprotoc.NewModuleSetForProtoc( @@ -174,7 +173,7 @@ func run( images := []bufimage.Image{image} if env.ByDir { f := func() (retErr error) { - defer zaputil.DebugProfile(logger)() + defer slogext.DebugProfile(logger)() images, err = bufimage.ImageByDir(image) return err } diff --git a/private/buf/cmd/buf/command/beta/registry/plugin/pluginpush/pluginpush.go b/private/buf/cmd/buf/command/beta/registry/plugin/pluginpush/pluginpush.go index 261c4bb3c4..904768431a 100644 --- a/private/buf/cmd/buf/command/beta/registry/plugin/pluginpush/pluginpush.go +++ b/private/buf/cmd/buf/command/beta/registry/plugin/pluginpush/pluginpush.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "net/http" "os" "strings" @@ -48,7 +49,6 @@ import ( "github.com/google/go-containerregistry/pkg/v1/remote/transport" "github.com/spf13/pflag" "go.uber.org/multierr" - "go.uber.org/zap" ) const ( @@ -305,8 +305,8 @@ func run( // Plugin with the same image digest and metadata already exists container.Logger().Info( "plugin already exists", - zap.String("name", pluginConfig.Name.IdentityString()), - zap.String("digest", plugin.ContainerImageDigest()), + slog.String("name", pluginConfig.Name.IdentityString()), + slog.String("digest", plugin.ContainerImageDigest()), ) curatedPlugin = latestPluginResp.Msg.Plugin } else { diff --git a/private/buf/cmd/buf/command/convert/convert.go b/private/buf/cmd/buf/command/convert/convert.go index aa0a7daca9..7270148958 100644 --- a/private/buf/cmd/buf/command/convert/convert.go +++ b/private/buf/cmd/buf/command/convert/convert.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "log/slog" "github.com/bufbuild/buf/private/buf/bufcli" "github.com/bufbuild/buf/private/buf/bufconvert" @@ -32,7 +33,6 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/spf13/pflag" - "go.uber.org/zap" ) const ( @@ -262,7 +262,7 @@ func inverseEncoding(encoding buffetch.MessageEncoding) (buffetch.MessageEncodin // wellKnownTypeImage returns an Image with just the given WKT type name (google.protobuf.Duration for example). func wellKnownTypeImage( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, wellKnownTypeName string, ) (bufimage.Image, error) { moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, logger, bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) diff --git a/private/buf/cmd/buf/command/dep/depupdate/depupdate.go b/private/buf/cmd/buf/command/dep/depupdate/depupdate.go index 2703be9713..7c536b0334 100644 --- a/private/buf/cmd/buf/command/dep/depupdate/depupdate.go +++ b/private/buf/cmd/buf/command/dep/depupdate/depupdate.go @@ -16,6 +16,8 @@ package depupdate import ( "context" + "fmt" + "log/slog" "github.com/bufbuild/buf/private/buf/bufcli" "github.com/bufbuild/buf/private/buf/bufctl" @@ -27,7 +29,6 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/spf13/pflag" "go.uber.org/multierr" - "go.uber.org/zap" ) const ( @@ -118,9 +119,10 @@ func run( if err != nil { return err } - logger.Debug( + logger.DebugContext( + ctx, "all deps", - zap.Strings("deps", slicesext.Map(configuredDepModuleKeys, bufmodule.ModuleKey.String)), + slog.Any("deps", slicesext.Map(configuredDepModuleKeys, bufmodule.ModuleKey.String)), ) // Store the existing buf.lock data. @@ -134,7 +136,7 @@ func run( // This ensures we do not create an empty buf.lock when one did not exist in the first // place and we do not need to go through the entire operation of updating non-existent // deps and building the image for tamper-proofing. - logger.Sugar().Warnf("No configured dependencies were found to update in %q.", dirPath) + logger.Warn(fmt.Sprintf("No configured dependencies were found to update in %q.", dirPath)) return nil } diff --git a/private/buf/cmd/buf/command/dep/internal/internal.go b/private/buf/cmd/buf/command/dep/internal/internal.go index f19291b24b..b68a2e0b62 100644 --- a/private/buf/cmd/buf/command/dep/internal/internal.go +++ b/private/buf/cmd/buf/command/dep/internal/internal.go @@ -17,6 +17,7 @@ package internal import ( "context" "fmt" + "log/slog" "github.com/bufbuild/buf/private/buf/bufcli" "github.com/bufbuild/buf/private/buf/bufctl" @@ -25,7 +26,6 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/syserror" - "go.uber.org/zap" ) // ModuleKeysAndTransitiveDepModuleKeysForModuleKeys gets the ModuleKeys for the @@ -56,7 +56,7 @@ func ModuleKeysAndTransitiveDepModuleKeysForModuleRefs( // Used by dep/mod prune. func Prune( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, controller bufctl.Controller, // Contains all the Modules and their transitive dependencies based on the buf.yaml. // @@ -112,7 +112,7 @@ func Prune( // dependencies as warnings to the user. func LogUnusedConfiguredDepsForWorkspace( workspace bufworkspace.Workspace, - logger *zap.Logger, + logger *slog.Logger, ) error { malformedDeps, err := bufworkspace.MalformedDepsForWorkspace(workspace) if err != nil { @@ -121,10 +121,10 @@ func LogUnusedConfiguredDepsForWorkspace( for _, malformedDep := range malformedDeps { switch t := malformedDep.Type(); t { case bufworkspace.MalformedDepTypeUnused: - logger.Sugar().Warnf( + logger.Warn(fmt.Sprintf( `Module %[1]s is declared in your buf.yaml deps but is unused. This command only modifies buf.lock files, not buf.yaml files. Please remove %[1]s from your buf.yaml deps if it is not needed.`, malformedDep.ModuleRef().ModuleFullName(), - ) + )) default: return fmt.Errorf("unknown MalformedDepType: %v", t) } diff --git a/private/buf/cmd/buf/command/generate/generate.go b/private/buf/cmd/buf/command/generate/generate.go index 0f0a660538..3912d284aa 100644 --- a/private/buf/cmd/buf/command/generate/generate.go +++ b/private/buf/cmd/buf/command/generate/generate.go @@ -17,6 +17,7 @@ package generate import ( "context" "fmt" + "log/slog" "os" "path/filepath" "strconv" @@ -34,7 +35,6 @@ import ( "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/spf13/pflag" - "go.uber.org/zap" ) const ( @@ -581,7 +581,7 @@ func readBufGenYAMLFile( func getInputImages( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, controller bufctl.Controller, inputSpecified string, bufGenYAMLFile bufconfig.BufGenYAMLFile, diff --git a/private/buf/cmd/internal/internal.go b/private/buf/cmd/internal/internal.go index 10d1da76ba..2c06b85599 100644 --- a/private/buf/cmd/internal/internal.go +++ b/private/buf/cmd/internal/internal.go @@ -24,7 +24,7 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufconfig" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/app/appext" - "github.com/bufbuild/buf/private/pkg/zaputil" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/bufbuild/protoplugin" ) @@ -79,18 +79,22 @@ func GetModuleConfigForProtocPlugin( // NewAppextContainerForPluginEnv creates a new appext.Container for the PluginEnv. // -// This isu sed bt the protoc plugins. +// This is used by the protoc plugins. func NewAppextContainerForPluginEnv( pluginEnv protoplugin.PluginEnv, appName string, - logLevel string, - logFormat string, + logLevelString string, + logFormatString string, ) (appext.Container, error) { - logger, err := zaputil.NewLoggerForFlagValues( - pluginEnv.Stderr, - logLevel, - logFormat, - ) + logLevel, err := appext.ParseLogLevel(logLevelString) + if err != nil { + return nil, err + } + logFormat, err := appext.ParseLogFormat(logFormatString) + if err != nil { + return nil, err + } + logger, err := slogapp.NewLogger(pluginEnv.Stderr, logLevel, logFormat) if err != nil { return nil, err } @@ -98,11 +102,14 @@ func NewAppextContainerForPluginEnv( if err != nil { return nil, err } + nameContainer, err := appext.NewNameContainer(appContainer, appName) + if err != nil { + return nil, err + } return appext.NewContainer( - appContainer, - appName, + nameContainer, logger, - ) + ), nil } type appContainer struct { diff --git a/private/bufpkg/bufcheck/breaking_test.go b/private/bufpkg/bufcheck/breaking_test.go index b781124e46..c87af2d1e6 100644 --- a/private/bufpkg/bufcheck/breaking_test.go +++ b/private/bufpkg/bufcheck/breaking_test.go @@ -31,12 +31,11 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/command" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/wasm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest" ) func TestRunBreakingEnumNoDelete(t *testing.T) { @@ -1270,7 +1269,7 @@ func testBreaking( ) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - logger := zaptest.NewLogger(t) + logger := slogtestext.NewLogger(t) baseDirPath := filepath.Join("testdata", "breaking", "current") basePreviousDirPath := filepath.Join("testdata", "breaking", "previous") @@ -1310,7 +1309,7 @@ func testBreaking( require.NoError(t, err) workspaceProvider := bufworkspace.NewWorkspaceProvider( - zap.NewNop(), + logger, bufmodule.NopGraphProvider, bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider, @@ -1330,14 +1329,14 @@ func testBreaking( previousImage, err := bufimage.BuildImage( ctx, - zap.NewNop(), + logger, bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(previousWorkspace), ) require.NoError(t, err) image, err := bufimage.BuildImage( ctx, - zap.NewNop(), + logger, bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(workspace), ) require.NoError(t, err) @@ -1346,7 +1345,7 @@ func testBreaking( require.NoError(t, err) breakingConfig := workspace.GetBreakingConfigForOpaqueID(opaqueID) require.NotNil(t, breakingConfig) - client, err := bufcheck.NewClient(zap.NewNop(), bufcheck.NewRunnerProvider(command.NewRunner(), wasm.UnimplementedRuntime)) + client, err := bufcheck.NewClient(logger, bufcheck.NewRunnerProvider(command.NewRunner(), wasm.UnimplementedRuntime)) require.NoError(t, err) err = client.Breaking( ctx, diff --git a/private/bufpkg/bufcheck/bufcheck.go b/private/bufpkg/bufcheck/bufcheck.go index 3141142ed9..0cff78425d 100644 --- a/private/bufpkg/bufcheck/bufcheck.go +++ b/private/bufpkg/bufcheck/bufcheck.go @@ -17,6 +17,7 @@ package bufcheck import ( "context" "io" + "log/slog" "buf.build/go/bufplugin/check" "github.com/bufbuild/buf/private/bufpkg/bufconfig" @@ -25,7 +26,6 @@ import ( "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/wasm" - "go.uber.org/zap" "pluginrpc.com/pluginrpc" ) @@ -187,7 +187,7 @@ func NewRunnerProvider(commandRunner command.Runner, wasmRuntime wasm.Runtime) R // NewClient returns a new Client. func NewClient( - logger *zap.Logger, + logger *slog.Logger, runnerProvider RunnerProvider, options ...ClientOption, ) (Client, error) { diff --git a/private/bufpkg/bufcheck/client.go b/private/bufpkg/bufcheck/client.go index b17d31c1e2..bba8ed0f80 100644 --- a/private/bufpkg/bufcheck/client.go +++ b/private/bufpkg/bufcheck/client.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io" + "log/slog" "strings" "buf.build/go/bufplugin/check" @@ -31,22 +32,21 @@ import ( "github.com/bufbuild/buf/private/pkg/protosourcepath" "github.com/bufbuild/buf/private/pkg/protoversion" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/bufbuild/buf/private/pkg/syserror" - "github.com/bufbuild/buf/private/pkg/zaputil" - "go.uber.org/zap" "pluginrpc.com/pluginrpc" ) type client struct { - logger *zap.Logger + logger *slog.Logger runnerProvider RunnerProvider stderr io.Writer fileVersionToDefaultCheckClient map[bufconfig.FileVersion]check.Client } func newClient( - logger *zap.Logger, + logger *slog.Logger, runnerProvider RunnerProvider, options ...ClientOption, ) (*client, error) { @@ -86,7 +86,7 @@ func (c *client) Lint( image bufimage.Image, options ...LintOption, ) error { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() if lintConfig.Disabled() { return nil @@ -145,7 +145,7 @@ func (c *client) Breaking( againstImage bufimage.Image, options ...BreakingOption, ) error { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() if breakingConfig.Disabled() { return nil @@ -214,7 +214,7 @@ func (c *client) ConfiguredRules( checkConfig bufconfig.CheckConfig, options ...ConfiguredRulesOption, ) ([]Rule, error) { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() configuredRulesOptions := newConfiguredRulesOptions() for _, option := range options { @@ -243,7 +243,7 @@ func (c *client) AllRules( fileVersion bufconfig.FileVersion, options ...AllRulesOption, ) ([]Rule, error) { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() allRulesOptions := newAllRulesOptions() for _, option := range options { @@ -261,7 +261,7 @@ func (c *client) AllCategories( fileVersion bufconfig.FileVersion, options ...AllCategoriesOption, ) ([]Category, error) { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() allCategoriesOptions := newAllCategoriesOptions() for _, option := range options { diff --git a/private/bufpkg/bufcheck/lint_test.go b/private/bufpkg/bufcheck/lint_test.go index 2370ae90db..1ff56ab7f3 100644 --- a/private/bufpkg/bufcheck/lint_test.go +++ b/private/bufpkg/bufcheck/lint_test.go @@ -28,12 +28,11 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/command" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/wasm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest" ) // Hint on how to get these: @@ -1298,6 +1297,7 @@ func testLintWithOptions( baseDirPath := filepath.Join("testdata", "lint") dirPath := filepath.Join(baseDirPath, relDirPath) + logger := slogtestext.NewLogger(t) storageosProvider := storageos.NewProvider(storageos.ProviderWithSymlinks()) readWriteBucket, err := storageosProvider.NewReadWriteBucket( dirPath, @@ -1306,7 +1306,7 @@ func testLintWithOptions( require.NoError(t, err) bucketTargeting, err := buftarget.NewBucketTargeting( ctx, - zaptest.NewLogger(t), + logger, readWriteBucket, ".", // the bucket is rooted at the input nil, @@ -1315,7 +1315,7 @@ func testLintWithOptions( ) require.NoError(t, err) workspace, err := bufworkspace.NewWorkspaceProvider( - zap.NewNop(), + logger, bufmodule.NopGraphProvider, bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider, @@ -1339,7 +1339,7 @@ func testLintWithOptions( moduleReadBucket := bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet) image, err := bufimage.BuildImage( ctx, - zap.NewNop(), + logger, moduleReadBucket, ) require.NoError(t, err) @@ -1355,7 +1355,7 @@ func testLintWithOptions( require.NoError(t, wasmRuntime.Close(ctx)) }) client, err := bufcheck.NewClient( - zap.NewNop(), + logger, bufcheck.NewRunnerProvider(command.NewRunner(), wasmRuntime), ) require.NoError(t, err) diff --git a/private/bufpkg/bufcheck/multi_client.go b/private/bufpkg/bufcheck/multi_client.go index 7c70a3858f..c25311edbe 100644 --- a/private/bufpkg/bufcheck/multi_client.go +++ b/private/bufpkg/bufcheck/multi_client.go @@ -17,23 +17,23 @@ package bufcheck import ( "context" "fmt" + "log/slog" "sort" "strings" "sync" "buf.build/go/bufplugin/check" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/thread" - "github.com/bufbuild/buf/private/pkg/zaputil" - "go.uber.org/zap" ) type multiClient struct { - logger *zap.Logger + logger *slog.Logger checkClientSpecs []*checkClientSpec } -func newMultiClient(logger *zap.Logger, checkClientSpecs []*checkClientSpec) *multiClient { +func newMultiClient(logger *slog.Logger, checkClientSpecs []*checkClientSpec) *multiClient { return &multiClient{ logger: logger, checkClientSpecs: checkClientSpecs, @@ -78,7 +78,7 @@ func (c *multiClient) Check(ctx context.Context, request check.Request) ([]*anno // request with no rule IDs will be made to the delegate client, and default rules will // be called. if len(requestDelegateRuleIDs) == 0 { - c.logger.Debug("skipping delegate client", zap.String("pluginName", delegate.PluginName)) + c.logger.DebugContext(ctx, "skipping delegate client", slog.String("pluginName", delegate.PluginName)) continue } delegateRequest, err := check.NewRequest( @@ -95,7 +95,7 @@ func (c *multiClient) Check(ctx context.Context, request check.Request) ([]*anno jobs = append( jobs, func(ctx context.Context) error { - defer zaputil.DebugProfile(c.logger, zap.String("plugin", delegate.PluginName))() + defer slogext.DebugProfile(c.logger, slog.String("plugin", delegate.PluginName))() delegateResponse, err := delegate.Client.Check(ctx, delegateRequest) if err != nil { if delegate.PluginName == "" { @@ -150,7 +150,7 @@ func (c *multiClient) getRulesCategoriesAndChunkedIDs(ctx context.Context) ( retChunkedCategoryIDs [][]string, retErr error, ) { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() var rules []Rule chunkedRuleIDs := make([][]string, len(c.checkClientSpecs)) for i, delegate := range c.checkClientSpecs { diff --git a/private/bufpkg/bufcheck/multi_client_test.go b/private/bufpkg/bufcheck/multi_client_test.go index 65601eb711..810887cd9a 100644 --- a/private/bufpkg/bufcheck/multi_client_test.go +++ b/private/bufpkg/bufcheck/multi_client_test.go @@ -26,11 +26,10 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufconfig" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/bufbuild/buf/private/pkg/wasm" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest" "google.golang.org/protobuf/reflect/protoreflect" ) @@ -106,7 +105,7 @@ func testMultiClientSimple(t *testing.T, cacheRules bool) { emptyOptions, err := option.NewOptions(nil) require.NoError(t, err) multiClient := newMultiClient( - zap.NewNop(), + slogtestext.NewLogger(t), []*checkClientSpec{ newCheckClientSpec("buf-plugin-field-lower-snake-case", fieldLowerSnakeCaseClient, emptyOptions), newCheckClientSpec("buf-plugin-timestamp-suffix", timestampSuffixClient, emptyOptions), @@ -166,7 +165,7 @@ func TestMultiClientCannotHaveOverlappingRules(t *testing.T) { emptyOptions, err := option.NewOptions(nil) require.NoError(t, err) multiClient := newMultiClient( - zap.NewNop(), + slogtestext.NewLogger(t), []*checkClientSpec{ newCheckClientSpec("buf-plugin-field-lower-snake-case", fieldLowerSnakeCaseClient, emptyOptions), newCheckClientSpec("buf-plugin-field-lower-snake-case", fieldLowerSnakeCaseClient, emptyOptions), @@ -183,7 +182,7 @@ func TestMultiClientCannotHaveOverlappingRulesWithBuiltIn(t *testing.T) { t.Parallel() client, err := newClient( - zaptest.NewLogger(t), + slogtestext.NewLogger(t), NewRunnerProvider(command.NewRunner(), wasm.UnimplementedRuntime), ) require.NoError(t, err) @@ -259,7 +258,7 @@ func TestMultiClientCannotHaveOverlappingCategories(t *testing.T) { emptyOptions, err := option.NewOptions(nil) require.NoError(t, err) multiClient := newMultiClient( - zap.NewNop(), + slogtestext.NewLogger(t), []*checkClientSpec{ newCheckClientSpec("buf-plugin-1", client1, emptyOptions), newCheckClientSpec("buf-plugin-2", client2, emptyOptions), @@ -276,7 +275,7 @@ func TestMultiClientCannotHaveOverlappingCategoriesWithBuiltIn(t *testing.T) { t.Parallel() client, err := newClient( - zaptest.NewLogger(t), + slogtestext.NewLogger(t), NewRunnerProvider(command.NewRunner(), wasm.UnimplementedRuntime), ) require.NoError(t, err) diff --git a/private/bufpkg/bufcheck/rules_config.go b/private/bufpkg/bufcheck/rules_config.go index 4fcbef0ec9..85e9f99e62 100644 --- a/private/bufpkg/bufcheck/rules_config.go +++ b/private/bufpkg/bufcheck/rules_config.go @@ -16,6 +16,7 @@ package bufcheck import ( "fmt" + "log/slog" "sort" "strings" @@ -25,7 +26,6 @@ import ( "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/bufbuild/buf/private/pkg/syserror" - "go.uber.org/zap" ) func rulesConfigForCheckConfig( @@ -45,8 +45,8 @@ func rulesConfigForCheckConfig( ) } -func logRulesConfig(logger *zap.Logger, rulesConfig *rulesConfig) { - logger.Debug("rulesConfig", zap.Strings("ruleIDs", rulesConfig.RuleIDs)) +func logRulesConfig(logger *slog.Logger, rulesConfig *rulesConfig) { + logger.Debug("rulesConfig", slog.Any("ruleIDs", rulesConfig.RuleIDs)) if len(rulesConfig.RuleIDs) == 0 { logger.Warn("No " + rulesConfig.RuleType.String() + " rules are configured.") } @@ -326,7 +326,7 @@ func newRulesConfig( // *** JUST USED WITHIN THIS FILE *** -func warnReferencedDeprecatedIDs(logger *zap.Logger, rulesConfig *rulesConfig) { +func warnReferencedDeprecatedIDs(logger *slog.Logger, rulesConfig *rulesConfig) { warnReferencedDeprecatedIDsForIDType( logger, rulesConfig.ReferencedDeprecatedRuleIDToReplacementIDs, @@ -341,7 +341,7 @@ func warnReferencedDeprecatedIDs(logger *zap.Logger, rulesConfig *rulesConfig) { ) } -func warnUnusedPlugins(logger *zap.Logger, rulesConfig *rulesConfig) { +func warnUnusedPlugins(logger *slog.Logger, rulesConfig *rulesConfig) { if len(rulesConfig.UnusedPluginNameToRuleIDs) == 0 { return } @@ -371,7 +371,7 @@ func warnUnusedPlugins(logger *zap.Logger, rulesConfig *rulesConfig) { } func warnReferencedDeprecatedIDsForIDType( - logger *zap.Logger, + logger *slog.Logger, referencedDeprecatedIDToReplacementIDs map[string]map[string]struct{}, capitalizedIDType string, pluralIDType string, diff --git a/private/bufpkg/bufconnect/interceptors_test.go b/private/bufpkg/bufconnect/interceptors_test.go index b236905431..910e14fccd 100644 --- a/private/bufpkg/bufconnect/interceptors_test.go +++ b/private/bufpkg/bufconnect/interceptors_test.go @@ -26,7 +26,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/netrc" - "github.com/bufbuild/buf/private/pkg/zaputil" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -112,7 +112,7 @@ func TestCLIWarningInterceptor(t *testing.T) { t.Parallel() warningMessage := "This is a warning message from the BSR" var buf bytes.Buffer - logger, err := zaputil.NewLoggerForFlagValues(&buf, "warn", "text") + logger, err := slogapp.NewLogger(&buf, appext.LogLevelWarn, appext.LogFormatText) require.NoError(t, err) // testing valid warning message _, err = NewCLIWarningInterceptor(appext.NewLoggerContainer(logger))(func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { @@ -136,7 +136,7 @@ func TestCLIWarningInterceptorFromError(t *testing.T) { t.Parallel() warningMessage := "This is a warning message from the BSR" var buf bytes.Buffer - logger, err := zaputil.NewLoggerForFlagValues(&buf, "warn", "text") + logger, err := slogapp.NewLogger(&buf, appext.LogLevelWarn, appext.LogFormatText) require.NoError(t, err) // testing valid warning message from error _, err = NewCLIWarningInterceptor(appext.NewLoggerContainer(logger))(func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) { diff --git a/private/bufpkg/bufimage/bufimage.go b/private/bufpkg/bufimage/bufimage.go index 6e09490225..3f3ba08558 100644 --- a/private/bufpkg/bufimage/bufimage.go +++ b/private/bufpkg/bufimage/bufimage.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "io/fs" + "log/slog" "math" "slices" "sort" @@ -34,7 +35,6 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/google/uuid" - "go.uber.org/zap" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/descriptorpb" "google.golang.org/protobuf/types/pluginpb" @@ -270,7 +270,7 @@ func NewImage(imageFiles []ImageFile) (Image, error) { // those returned by [bufmodule.GetTargetFileInfos]. func BuildImage( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, moduleReadBucket bufmodule.ModuleReadBucket, options ...BuildImageOption, ) (Image, error) { diff --git a/private/bufpkg/bufimage/bufimagefuzz/bufimagefuzz_unix_test.go b/private/bufpkg/bufimage/bufimagefuzz/bufimagefuzz_unix_test.go index 9bc8470bd2..71ae4c9550 100644 --- a/private/bufpkg/bufimage/bufimagefuzz/bufimagefuzz_unix_test.go +++ b/private/bufpkg/bufimage/bufimagefuzz/bufimagefuzz_unix_test.go @@ -32,10 +32,10 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/prototesting" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/tmp" "github.com/stretchr/testify/require" "go.uber.org/multierr" - "go.uber.org/zap" "golang.org/x/tools/txtar" "google.golang.org/protobuf/types/descriptorpb" ) @@ -147,7 +147,7 @@ func fuzzBuild(ctx context.Context, dirPath string) (bufimage.Image, error) { } return bufimage.BuildImage( ctx, - zap.NewNop(), + slogext.NopLogger, bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), bufimage.WithExcludeSourceCodeInfo(), ) diff --git a/private/bufpkg/bufimage/bufimagemodify/bufimagemodify_test.go b/private/bufpkg/bufimage/bufimagemodify/bufimagemodify_test.go index 54400e4a88..9bfb1d6ac8 100644 --- a/private/bufpkg/bufimage/bufimagemodify/bufimagemodify_test.go +++ b/private/bufpkg/bufimage/bufimagemodify/bufimagemodify_test.go @@ -25,10 +25,10 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufimage/bufimagetesting" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/google/go-cmp/cmp" "github.com/google/uuid" "github.com/stretchr/testify/require" - "go.uber.org/zap" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/testing/protocmp" "google.golang.org/protobuf/types/descriptorpb" @@ -811,7 +811,7 @@ func testGetImageFromDirs( } image, err := bufimage.BuildImage( context.Background(), - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), options..., ) diff --git a/private/bufpkg/bufimage/bufimageutil/bufimageutil_test.go b/private/bufpkg/bufimage/bufimageutil/bufimageutil_test.go index 0995fd35cd..524f102a3c 100644 --- a/private/bufpkg/bufimage/bufimageutil/bufimageutil_test.go +++ b/private/bufpkg/bufimage/bufimageutil/bufimageutil_test.go @@ -18,6 +18,7 @@ import ( "bytes" "context" "io" + "log/slog" "os" "sort" "testing" @@ -26,14 +27,13 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting" "github.com/bufbuild/buf/private/pkg/protoencoding" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/google/uuid" "github.com/jhump/protoreflect/v2/protoprint" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest" "golang.org/x/tools/txtar" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protodesc" @@ -174,7 +174,7 @@ func TestTransitivePublic(t *testing.T) { require.NoError(t, err) image, err := bufimage.BuildImage( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), bufimage.WithExcludeSourceCodeInfo(), ) @@ -209,7 +209,7 @@ func TestTypesFromMainModule(t *testing.T) { require.NoError(t, err) image, err := bufimage.BuildImage( ctx, - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), bufimage.WithExcludeSourceCodeInfo(), ) @@ -233,7 +233,7 @@ func TestTypesFromMainModule(t *testing.T) { assert.ErrorIs(t, err, ErrImageFilterTypeNotFound) } -func getImage(ctx context.Context, logger *zap.Logger, testdataDir string, options ...bufimage.BuildImageOption) (storage.ReadWriteBucket, bufimage.Image, error) { +func getImage(ctx context.Context, logger *slog.Logger, testdataDir string, options ...bufimage.BuildImageOption) (storage.ReadWriteBucket, bufimage.Image, error) { bucket, err := storageos.NewProvider().NewReadWriteBucket(testdataDir) if err != nil { return nil, nil, err @@ -244,7 +244,7 @@ func getImage(ctx context.Context, logger *zap.Logger, testdataDir string, optio } image, err := bufimage.BuildImage( ctx, - zap.NewNop(), + logger, bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), options..., ) @@ -256,7 +256,7 @@ func getImage(ctx context.Context, logger *zap.Logger, testdataDir string, optio func runDiffTest(t *testing.T, testdataDir string, typenames []string, expectedFile string, opts ...ImageFilterOption) { ctx := context.Background() - bucket, image, err := getImage(ctx, zaptest.NewLogger(t), testdataDir, bufimage.WithExcludeSourceCodeInfo()) + bucket, image, err := getImage(ctx, slogtestext.NewLogger(t), testdataDir, bufimage.WithExcludeSourceCodeInfo()) require.NoError(t, err) filteredImage, err := ImageFilteredByTypesWithOptions(image, typenames, opts...) @@ -320,7 +320,7 @@ func checkExpectation(t *testing.T, ctx context.Context, actual []byte, bucket s func runSourceCodeInfoTest(t *testing.T, typename string, expectedFile string, opts ...ImageFilterOption) { ctx := context.Background() - bucket, image, err := getImage(ctx, zaptest.NewLogger(t), "testdata/sourcecodeinfo") + bucket, image, err := getImage(ctx, slogtestext.NewLogger(t), "testdata/sourcecodeinfo") require.NoError(t, err) filteredImage, err := ImageFilteredByTypesWithOptions(image, []string{typename}, opts...) @@ -453,7 +453,7 @@ func benchmarkFilterImage(b *testing.B, opts ...bufimage.BuildImageOption) { } ctx := context.Background() for _, benchmarkCase := range benchmarkCases { - _, image, err := getImage(ctx, zaptest.NewLogger(b), benchmarkCase.folder, opts...) + _, image, err := getImage(ctx, slogtestext.NewLogger(b), benchmarkCase.folder, opts...) require.NoError(b, err) benchmarkCase.image = image } diff --git a/private/bufpkg/bufimage/build_image.go b/private/bufpkg/bufimage/build_image.go index 2ca8d7e467..a29555014e 100644 --- a/private/bufpkg/bufimage/build_image.go +++ b/private/bufpkg/bufimage/build_image.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "log/slog" "math" "strings" @@ -25,15 +26,14 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/bufpkg/bufprotocompile" "github.com/bufbuild/buf/private/pkg/protoencoding" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/thread" - "github.com/bufbuild/buf/private/pkg/zaputil" "github.com/bufbuild/protocompile" "github.com/bufbuild/protocompile/linker" "github.com/bufbuild/protocompile/parser" "github.com/bufbuild/protocompile/protoutil" "github.com/bufbuild/protocompile/reporter" - "go.uber.org/zap" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/types/dynamicpb" @@ -41,12 +41,12 @@ import ( func buildImage( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, moduleReadBucket bufmodule.ModuleReadBucket, excludeSourceCodeInfo bool, noParallelism bool, ) (Image, error) { - defer zaputil.DebugProfile(logger)() + defer slogext.DebugProfile(logger)() if !moduleReadBucket.ShouldBeSelfContained() { return nil, syserror.New("passed a ModuleReadBucket to BuildImage that was not expected to be self-contained") diff --git a/private/bufpkg/bufimage/build_image_test.go b/private/bufpkg/bufimage/build_image_test.go index 94db3b6298..7f02a3a046 100644 --- a/private/bufpkg/bufimage/build_image_test.go +++ b/private/bufpkg/bufimage/build_image_test.go @@ -32,10 +32,10 @@ import ( "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/prototesting" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/testingext" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) var buftestingDirPath = filepath.Join( @@ -305,7 +305,7 @@ func TestOptionPanic(t *testing.T) { require.NoError(t, err) _, err = bufimage.BuildImage( context.Background(), - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), ) require.NoError(t, err) @@ -356,7 +356,7 @@ func TestModuleTargetFiles(t *testing.T) { } image, err := bufimage.BuildImage( context.Background(), - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(targetModuleSet), ) require.NoError(t, err) @@ -399,7 +399,7 @@ func testBuild(t *testing.T, includeSourceInfo bool, dirPath string, parallelism } image, err := bufimage.BuildImage( context.Background(), - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), options..., ) diff --git a/private/bufpkg/bufmodule/bufmodule_test.go b/private/bufpkg/bufmodule/bufmodule_test.go index 96c59f13be..9efcec6f8e 100644 --- a/private/bufpkg/bufmodule/bufmodule_test.go +++ b/private/bufpkg/bufmodule/bufmodule_test.go @@ -23,10 +23,10 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting" "github.com/bufbuild/buf/private/pkg/dag/dagtest" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestBasic(t *testing.T) { @@ -86,7 +86,7 @@ func TestBasic(t *testing.T) { // This is the ModuleSetBuilder that will build the modules that we are going to test. // This is replicating how a workspace would be built from remote dependencies and // local sources. - moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, zap.NewNop(), bsrProvider, bsrProvider) + moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bsrProvider, bsrProvider) // First, we add the remote dependences (adding order doesn't matter). // @@ -570,7 +570,7 @@ func TestProtoFileTargetPath(t *testing.T) { }, ) - moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, zap.NewNop(), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) + moduleSetBuilder := bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) moduleSetBuilder.AddLocalModule(bucket, "module1", true) moduleSet, err := moduleSetBuilder.Build() require.NoError(t, err) @@ -596,7 +596,7 @@ func TestProtoFileTargetPath(t *testing.T) { ) // The single file a/1.proto - moduleSetBuilder = bufmodule.NewModuleSetBuilder(ctx, zap.NewNop(), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) + moduleSetBuilder = bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) moduleSetBuilder.AddLocalModule( bucket, "module1", @@ -626,7 +626,7 @@ func TestProtoFileTargetPath(t *testing.T) { ) // The single file a/1.proto with package files - moduleSetBuilder = bufmodule.NewModuleSetBuilder(ctx, zap.NewNop(), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) + moduleSetBuilder = bufmodule.NewModuleSetBuilder(ctx, slogtestext.NewLogger(t), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) moduleSetBuilder.AddLocalModule( bucket, "module1", diff --git a/private/bufpkg/bufmodule/bufmoduleapi/cmd/buf-legacyfederation-go-data/main.go b/private/bufpkg/bufmodule/bufmoduleapi/cmd/buf-legacyfederation-go-data/main.go index d05214c787..a3087d7c9f 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/cmd/buf-legacyfederation-go-data/main.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/cmd/buf-legacyfederation-go-data/main.go @@ -27,6 +27,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appcmd" "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/shake256" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/spf13/pflag" ) @@ -41,7 +42,10 @@ func main() { func newCommand() *appcmd.Command { flags := newFlags() - builder := appext.NewBuilder(programName) + builder := appext.NewBuilder( + programName, + appext.BuilderWithLoggerProvider(slogapp.LoggerProvider), + ) return &appcmd.Command{ Use: programName, Short: "Send a newline-separated file via stdin", diff --git a/private/bufpkg/bufmodule/bufmoduleapi/commit_provider.go b/private/bufpkg/bufmodule/bufmoduleapi/commit_provider.go index 464a6cb418..6e75311f96 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/commit_provider.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/commit_provider.go @@ -16,6 +16,7 @@ package bufmoduleapi import ( "context" + "log/slog" "time" "github.com/bufbuild/buf/private/bufpkg/bufapi" @@ -24,12 +25,11 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/google/uuid" - "go.uber.org/zap" ) // NewCommitProvider returns a new CommitProvider for the given API client. func NewCommitProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1CommitServiceClientProvider bufapi.V1ModuleServiceClientProvider @@ -43,7 +43,7 @@ func NewCommitProvider( // *** PRIVATE *** type commitProvider struct { - logger *zap.Logger + logger *slog.Logger clientProvider interface { bufapi.V1CommitServiceClientProvider bufapi.V1ModuleServiceClientProvider @@ -53,7 +53,7 @@ type commitProvider struct { } func newCommitProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1CommitServiceClientProvider bufapi.V1ModuleServiceClientProvider diff --git a/private/bufpkg/bufmodule/bufmoduleapi/graph_provider.go b/private/bufpkg/bufmodule/bufmoduleapi/graph_provider.go index 3e7510e824..46278bf755 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/graph_provider.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/graph_provider.go @@ -17,6 +17,7 @@ package bufmoduleapi import ( "context" "fmt" + "log/slog" modulev1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/module/v1" modulev1beta1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/module/v1beta1" @@ -27,12 +28,11 @@ import ( "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" - "go.uber.org/zap" ) // NewGraphProvider returns a new GraphProvider for the given API client. func NewGraphProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1GraphServiceClientProvider bufapi.V1ModuleServiceClientProvider @@ -74,7 +74,7 @@ func GraphProviderWithPublicRegistry(publicRegistry string) GraphProviderOption // *** PRIVATE *** type graphProvider struct { - logger *zap.Logger + logger *slog.Logger clientProvider interface { bufapi.V1GraphServiceClientProvider bufapi.V1ModuleServiceClientProvider @@ -86,7 +86,7 @@ type graphProvider struct { } func newGraphProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1GraphServiceClientProvider bufapi.V1ModuleServiceClientProvider diff --git a/private/bufpkg/bufmodule/bufmoduleapi/module_data_provider.go b/private/bufpkg/bufmodule/bufmoduleapi/module_data_provider.go index b4e8659f74..0fcded0347 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/module_data_provider.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/module_data_provider.go @@ -17,6 +17,7 @@ package bufmoduleapi import ( "context" "fmt" + "log/slog" "sort" modulev1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/module/v1" @@ -27,14 +28,13 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/google/uuid" - "go.uber.org/zap" ) // NewModuleDataProvider returns a new ModuleDataProvider for the given API client. // // A warning is printed to the logger if a given Module is deprecated. func NewModuleDataProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1DownloadServiceClientProvider bufapi.V1ModuleServiceClientProvider @@ -48,7 +48,7 @@ func NewModuleDataProvider( // *** PRIVATE *** type moduleDataProvider struct { - logger *zap.Logger + logger *slog.Logger clientProvider interface { bufapi.V1DownloadServiceClientProvider bufapi.V1ModuleServiceClientProvider @@ -58,7 +58,7 @@ type moduleDataProvider struct { } func newModuleDataProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1DownloadServiceClientProvider bufapi.V1ModuleServiceClientProvider diff --git a/private/bufpkg/bufmodule/bufmoduleapi/module_key_provider.go b/private/bufpkg/bufmodule/bufmoduleapi/module_key_provider.go index 2ec8eb1b56..90ef844223 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/module_key_provider.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/module_key_provider.go @@ -16,17 +16,17 @@ package bufmoduleapi import ( "context" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufapi" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/uuidutil" - "go.uber.org/zap" ) // NewModuleKeyProvider returns a new ModuleKeyProvider for the given API clients. func NewModuleKeyProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1CommitServiceClientProvider bufapi.V1Beta1CommitServiceClientProvider @@ -38,7 +38,7 @@ func NewModuleKeyProvider( // *** PRIVATE *** type moduleKeyProvider struct { - logger *zap.Logger + logger *slog.Logger clientProvider interface { bufapi.V1CommitServiceClientProvider bufapi.V1Beta1CommitServiceClientProvider @@ -46,7 +46,7 @@ type moduleKeyProvider struct { } func newModuleKeyProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1CommitServiceClientProvider bufapi.V1Beta1CommitServiceClientProvider diff --git a/private/bufpkg/bufmodule/bufmoduleapi/uploader.go b/private/bufpkg/bufmodule/bufmoduleapi/uploader.go index 89d298280a..0b60b6eed0 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/uploader.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/uploader.go @@ -17,6 +17,7 @@ package bufmoduleapi import ( "context" "fmt" + "log/slog" "strings" "time" @@ -30,12 +31,11 @@ import ( "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/google/uuid" - "go.uber.org/zap" ) // NewUploader returns a new Uploader for the given API client. func NewUploader( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1ModuleServiceClientProvider bufapi.V1UploadServiceClientProvider @@ -65,7 +65,7 @@ func UploaderWithPublicRegistry(publicRegistry string) UploaderOption { // *** PRIVATE *** type uploader struct { - logger *zap.Logger + logger *slog.Logger clientProvider interface { bufapi.V1ModuleServiceClientProvider bufapi.V1UploadServiceClientProvider @@ -75,7 +75,7 @@ type uploader struct { } func newUploader( - logger *zap.Logger, + logger *slog.Logger, clientProvider interface { bufapi.V1ModuleServiceClientProvider bufapi.V1UploadServiceClientProvider @@ -115,7 +115,7 @@ func (a *uploader) Upload( if moduleName == nil { moduleDescription := module.Description() if uploadOptions.ExcludeUnnamed() { - a.logger.Warn("Excluding unnamed module", zap.String("module", moduleDescription)) + a.logger.Warn("Excluding unnamed module", slog.String("module", moduleDescription)) return false, nil } return false, fmt.Errorf("a name must be specified in buf.yaml to push module: %s", moduleDescription) diff --git a/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_module_provider.go b/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_module_provider.go index 5d46525b82..e56e011ecd 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_module_provider.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_module_provider.go @@ -17,12 +17,12 @@ package bufmoduleapi import ( "context" "fmt" + "log/slog" modulev1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/module/v1" "connectrpc.com/connect" "github.com/bufbuild/buf/private/bufpkg/bufapi" "github.com/bufbuild/buf/private/pkg/cache" - "go.uber.org/zap" ) // v1ProtoModuleProvider provides a per-call provider of proto Modules. @@ -30,13 +30,13 @@ import ( // We don't want to persist these across calls - this could grow over time and this cache // isn't an LRU cache, and the information also may change over time. type v1ProtoModuleProvider struct { - logger *zap.Logger + logger *slog.Logger clientProvider bufapi.V1ModuleServiceClientProvider protoModuleCache cache.Cache[string, *modulev1.Module] } func newV1ProtoModuleProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider bufapi.V1ModuleServiceClientProvider, ) *v1ProtoModuleProvider { return &v1ProtoModuleProvider{ diff --git a/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_owner_provider.go b/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_owner_provider.go index f44b0f277e..e0cc5504ce 100644 --- a/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_owner_provider.go +++ b/private/bufpkg/bufmodule/bufmoduleapi/v1_proto_owner_provider.go @@ -17,12 +17,12 @@ package bufmoduleapi import ( "context" "fmt" + "log/slog" ownerv1 "buf.build/gen/go/bufbuild/registry/protocolbuffers/go/buf/registry/owner/v1" "connectrpc.com/connect" "github.com/bufbuild/buf/private/bufpkg/bufapi" "github.com/bufbuild/buf/private/pkg/cache" - "go.uber.org/zap" ) // v1ProtoOwnerProvider provides a per-call provider of proto Modules. @@ -30,13 +30,13 @@ import ( // We don't want to persist these across calls - this could grow over time and this cache // isn't an LRU cache, and the information also may change over time. type v1ProtoOwnerProvider struct { - logger *zap.Logger + logger *slog.Logger clientProvider bufapi.V1OwnerServiceClientProvider protoOwnerCache cache.Cache[string, *ownerv1.Owner] } func newV1ProtoOwnerProvider( - logger *zap.Logger, + logger *slog.Logger, clientProvider bufapi.V1OwnerServiceClientProvider, ) *v1ProtoOwnerProvider { return &v1ProtoOwnerProvider{ diff --git a/private/bufpkg/bufmodule/bufmodulecache/base_provider.go b/private/bufpkg/bufmodule/bufmodulecache/base_provider.go index 384c048977..ef956edd19 100644 --- a/private/bufpkg/bufmodule/bufmodulecache/base_provider.go +++ b/private/bufpkg/bufmodule/bufmodulecache/base_provider.go @@ -16,17 +16,17 @@ package bufmodulecache import ( "context" + "log/slog" "sync/atomic" "github.com/bufbuild/buf/private/pkg/slicesext" "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/google/uuid" - "go.uber.org/zap" ) type baseProvider[K any, V any] struct { - logger *zap.Logger + logger *slog.Logger delegateGetValuesForKeys func(context.Context, []K) ([]V, error) storeGetValuesForKeys func(context.Context, []K) ([]V, []K, error) storePutValues func(context.Context, []V) error @@ -38,7 +38,7 @@ type baseProvider[K any, V any] struct { } func newBaseProvider[K any, V any]( - logger *zap.Logger, + logger *slog.Logger, delegateGetValuesForKeys func(context.Context, []K) ([]V, error), storeGetValuesForKeys func(context.Context, []K) ([]V, []K, error), storePutValues func(context.Context, []V) error, diff --git a/private/bufpkg/bufmodule/bufmodulecache/bufmodulecache_test.go b/private/bufpkg/bufmodule/bufmodulecache/bufmodulecache_test.go index 1933d39b56..d5213a80b1 100644 --- a/private/bufpkg/bufmodule/bufmodulecache/bufmodulecache_test.go +++ b/private/bufpkg/bufmodule/bufmodulecache/bufmodulecache_test.go @@ -16,7 +16,6 @@ package bufmodulecache import ( "context" - "fmt" "os" "path/filepath" "testing" @@ -27,12 +26,11 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting" "github.com/bufbuild/buf/private/pkg/filelock" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/thread" "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest" ) func TestCommitProviderForModuleKeyBasic(t *testing.T) { @@ -41,12 +39,13 @@ func TestCommitProviderForModuleKeyBasic(t *testing.T) { ctx := context.Background() bsrProvider, moduleKeys := testGetBSRProviderAndModuleKeys(t, ctx) + logger := slogtestext.NewLogger(t) cacheProvider := newCommitProvider( - zap.NewNop(), + logger, bsrProvider, bufmodulestore.NewCommitStore( - zap.NewNop(), + logger, storagemem.NewReadWriteBucket(), ), ) @@ -103,14 +102,15 @@ func TestCommitProviderForCommitKeyBasic(t *testing.T) { ctx := context.Background() bsrProvider, moduleKeys := testGetBSRProviderAndModuleKeys(t, ctx) + logger := slogtestext.NewLogger(t) commitKeys, err := slicesext.MapError(moduleKeys, bufmodule.ModuleKeyToCommitKey) require.NoError(t, err) cacheProvider := newCommitProvider( - zap.NewNop(), + logger, bsrProvider, bufmodulestore.NewCommitStore( - zap.NewNop(), + logger, storagemem.NewReadWriteBucket(), ), ) @@ -166,12 +166,13 @@ func TestModuleDataProviderBasic(t *testing.T) { ctx := context.Background() bsrProvider, moduleKeys := testGetBSRProviderAndModuleKeys(t, ctx) + logger := slogtestext.NewLogger(t) cacheProvider := newModuleDataProvider( - zap.NewNop(), + logger, bsrProvider, bufmodulestore.NewModuleDataStore( - zap.NewNop(), + logger, storagemem.NewReadWriteBucket(), filelock.NewNopLocker(), ), @@ -229,14 +230,13 @@ func TestConcurrentCacheReadWrite(t *testing.T) { bsrProvider, moduleKeys := testGetBSRProviderAndModuleKeys(t, context.Background()) tempDir := t.TempDir() cacheDir := filepath.Join(tempDir, "cache") - logger := zaptest.NewLogger(t, zaptest.Level(zap.InfoLevel)) + logger := slogtestext.NewLogger(t) for i := 0; i < 20; i++ { require.NoError(t, os.MkdirAll(cacheDir, 0755)) jobs, err := slicesext.MapError( []int{0, 1, 2, 3, 4}, func(i int) (func(ctx context.Context) error, error) { - logger := logger.Named(fmt.Sprintf("job-%d", i)) bucket, err := storageos.NewProvider().NewReadWriteBucket(cacheDir) if err != nil { return nil, err diff --git a/private/bufpkg/bufmodule/bufmodulecache/commit_provider.go b/private/bufpkg/bufmodule/bufmodulecache/commit_provider.go index 27712ed8a5..6f93182352 100644 --- a/private/bufpkg/bufmodule/bufmodulecache/commit_provider.go +++ b/private/bufpkg/bufmodule/bufmodulecache/commit_provider.go @@ -16,18 +16,18 @@ package bufmodulecache import ( "context" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmodulestore" "github.com/google/uuid" - "go.uber.org/zap" ) // NewCommitProvider returns a new CommitProvider that caches the results of the delegate. // // The CommitStore is used as a cache. func NewCommitProvider( - logger *zap.Logger, + logger *slog.Logger, delegate bufmodule.CommitProvider, store bufmodulestore.CommitStore, ) bufmodule.CommitProvider { @@ -42,7 +42,7 @@ type commitProvider struct { } func newCommitProvider( - logger *zap.Logger, + logger *slog.Logger, delegate bufmodule.CommitProvider, store bufmodulestore.CommitStore, ) *commitProvider { diff --git a/private/bufpkg/bufmodule/bufmodulecache/module_data_provider.go b/private/bufpkg/bufmodule/bufmodulecache/module_data_provider.go index 350bcea06e..1cbd006568 100644 --- a/private/bufpkg/bufmodule/bufmodulecache/module_data_provider.go +++ b/private/bufpkg/bufmodule/bufmodulecache/module_data_provider.go @@ -16,18 +16,18 @@ package bufmodulecache import ( "context" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmodulestore" "github.com/google/uuid" - "go.uber.org/zap" ) // NewModuleDataProvider returns a new ModuleDataProvider that caches the results of the delegate. // // The ModuleDataStore is used as a cache. func NewModuleDataProvider( - logger *zap.Logger, + logger *slog.Logger, delegate bufmodule.ModuleDataProvider, store bufmodulestore.ModuleDataStore, ) bufmodule.ModuleDataProvider { @@ -41,7 +41,7 @@ type moduleDataProvider struct { } func newModuleDataProvider( - logger *zap.Logger, + logger *slog.Logger, delegate bufmodule.ModuleDataProvider, store bufmodulestore.ModuleDataStore, ) *moduleDataProvider { diff --git a/private/bufpkg/bufmodule/bufmodulestore/commit_store.go b/private/bufpkg/bufmodule/bufmodulestore/commit_store.go index 961c559db0..057d39b155 100644 --- a/private/bufpkg/bufmodule/bufmodulestore/commit_store.go +++ b/private/bufpkg/bufmodule/bufmodulestore/commit_store.go @@ -20,14 +20,15 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "time" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/normalpath" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/syserror" "github.com/bufbuild/buf/private/pkg/uuidutil" - "go.uber.org/zap" ) var externalCommitVersion = "v1" @@ -62,7 +63,7 @@ type CommitStore interface { // // This is typically used to interact with a cache directory. func NewCommitStore( - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadWriteBucket, ) CommitStore { return newCommitStore(logger, bucket) @@ -71,12 +72,12 @@ func NewCommitStore( /// *** PRIVATE *** type commitStore struct { - logger *zap.Logger + logger *slog.Logger bucket storage.ReadWriteBucket } func newCommitStore( - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadWriteBucket, ) *commitStore { return &commitStore{ @@ -151,14 +152,15 @@ func (p *commitStore) getCommitForCommitKey( // may be nil expectedDigest bufmodule.Digest, ) (_ bufmodule.Commit, retErr error) { - bucket := p.getReadWriteBucketForDir(commitKey) + bucket := p.getReadWriteBucketForDir(ctx, commitKey) path := getCommitStoreFilePath(commitKey) data, err := storage.ReadPath(ctx, bucket, path) p.logDebugCommitKey( + ctx, commitKey, "commit store get file", - zap.Bool("found", err == nil), - zap.Error(err), + slog.Bool("found", err == nil), + slogext.ErrorAttr(err), ) if err != nil { return nil, err @@ -233,7 +235,7 @@ func (p *commitStore) putCommit( if err != nil { return err } - bucket := p.getReadWriteBucketForDir(commitKey) + bucket := p.getReadWriteBucketForDir(ctx, commitKey) path := getCommitStoreFilePath(commitKey) externalCommit := externalCommit{ Version: externalCommitVersion, @@ -252,12 +254,13 @@ func (p *commitStore) putCommit( return storage.PutPath(ctx, bucket, path, data, storage.PutWithAtomic()) } -func (p *commitStore) getReadWriteBucketForDir(commitKey bufmodule.CommitKey) storage.ReadWriteBucket { +func (p *commitStore) getReadWriteBucketForDir(ctx context.Context, commitKey bufmodule.CommitKey) storage.ReadWriteBucket { dirPath := getCommitStoreDirPath(commitKey) p.logDebugCommitKey( + ctx, commitKey, "commit store dir read write bucket", - zap.String("dirPath", dirPath), + slog.String("dirPath", dirPath), ) return storage.MapReadWriteBucket(p.bucket, storage.MapOnPrefix(dirPath)) } @@ -271,25 +274,27 @@ func (p *commitStore) deleteInvalidCommitFile( invalidErr error, ) error { p.logDebugCommitKey( + ctx, commitKey, fmt.Sprintf("commit store %s commit file", invalidReason), - zap.Error(invalidErr), + slog.Any("error", invalidErr), ) // Attempt to delete file as it is missing information. if err := bucket.Delete(ctx, path); err != nil { // Otherwise ignore error. p.logDebugCommitKey( + ctx, commitKey, fmt.Sprintf("commit store could not delete %s commit file", invalidReason), - zap.Error(err), + slogext.ErrorAttr(err), ) } // This will act as if the file is not found return &fs.PathError{Op: "read", Path: path, Err: fs.ErrNotExist} } -func (p *commitStore) logDebugCommitKey(commitKey bufmodule.CommitKey, message string, fields ...zap.Field) { - logDebugCommitKey(p.logger, commitKey, message, fields...) +func (p *commitStore) logDebugCommitKey(ctx context.Context, commitKey bufmodule.CommitKey, message string, fields ...any) { + logDebugCommitKey(ctx, p.logger, commitKey, message, fields...) } // Returns the directory path within the store for the Commit. diff --git a/private/bufpkg/bufmodule/bufmodulestore/module_data_store.go b/private/bufpkg/bufmodule/bufmodulestore/module_data_store.go index 4350480e3e..bfd953e0af 100644 --- a/private/bufpkg/bufmodule/bufmodulestore/module_data_store.go +++ b/private/bufpkg/bufmodule/bufmodulestore/module_data_store.go @@ -19,18 +19,19 @@ import ( "errors" "fmt" "io/fs" + "log/slog" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/encoding" "github.com/bufbuild/buf/private/pkg/filelock" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storagearchive" "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/bufbuild/buf/private/pkg/uuidutil" "go.uber.org/multierr" - "go.uber.org/zap" ) var ( @@ -78,7 +79,7 @@ type ModuleDataStore interface { // // This is typically used to interact with a cache directory. func NewModuleDataStore( - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadWriteBucket, locker filelock.Locker, options ...ModuleDataStoreOption, @@ -102,7 +103,7 @@ func ModuleDataStoreWithTar() ModuleDataStoreOption { /// *** PRIVATE *** type moduleDataStore struct { - logger *zap.Logger + logger *slog.Logger bucket storage.ReadWriteBucket locker filelock.Locker @@ -110,7 +111,7 @@ type moduleDataStore struct { } func newModuleDataStore( - logger *zap.Logger, + logger *slog.Logger, bucket storage.ReadWriteBucket, locker filelock.Locker, options ...ModuleDataStoreOption, @@ -213,9 +214,10 @@ func (p *moduleDataStore) getModuleDataForModuleKey( return nil, err } p.logDebugModuleKey( + ctx, moduleKey, "module data store dir read write bucket", - zap.String("dirPath", dirPath), + slog.String("dirPath", dirPath), ) moduleCacheBucket = storage.MapReadWriteBucket(p.bucket, storage.MapOnPrefix(dirPath)) moduleDataStoreDirLockPath, err := getModuleDataStoreDirLockPath(moduleKey) @@ -239,10 +241,11 @@ func (p *moduleDataStore) getModuleDataForModuleKey( // the module data. data, err := storage.ReadPath(ctx, moduleCacheBucket, externalModuleDataFileName) p.logDebugModuleKey( + ctx, moduleKey, fmt.Sprintf("module data store get %s", externalModuleDataFileName), - zap.Bool("found", err == nil), - zap.Error(err), + slog.Bool("found", err == nil), + slogext.ErrorAttr(err), ) if err != nil { return nil, err @@ -366,9 +369,10 @@ func (p *moduleDataStore) putModuleData( return err } p.logDebugModuleKey( + ctx, moduleKey, "module data store dir read write bucket", - zap.String("dirPath", dirPath), + slog.String("dirPath", dirPath), ) moduleCacheBucket = storage.MapReadWriteBucket(p.bucket, storage.MapOnPrefix(dirPath)) moduleDataStoreDirLockPath, err := getModuleDataStoreDirLockPath(moduleKey) @@ -389,10 +393,11 @@ func (p *moduleDataStore) putModuleData( }() data, err := storage.ReadPath(ctx, moduleCacheBucket, externalModuleDataFileName) p.logDebugModuleKey( + ctx, moduleKey, fmt.Sprintf("module data store put read check %s", externalModuleDataFileName), - zap.Bool("found", err == nil), - zap.Error(err), + slog.Bool("found", err == nil), + slogext.ErrorAttr(err), ) if err != nil && !errors.Is(err, fs.ErrNotExist) { return err @@ -435,10 +440,11 @@ func (p *moduleDataStore) putModuleData( // and we need to make sure no valid module data was written in the interim. data, err = storage.ReadPath(ctx, moduleCacheBucket, externalModuleDataFileName) p.logDebugModuleKey( + ctx, moduleKey, fmt.Sprintf("module data store put check %s", externalModuleDataFileName), - zap.Bool("found", err == nil), - zap.Error(err), + slog.Bool("found", err == nil), + slogext.ErrorAttr(err), ) if err != nil && !errors.Is(err, fs.ErrNotExist) { return err @@ -540,11 +546,12 @@ func (p *moduleDataStore) getReadBucketForTar( } defer func() { p.logDebugModuleKey( + ctx, moduleKey, "module data store get tar read bucket", - zap.String("tarPath", tarPath), - zap.Bool("found", retErr == nil), - zap.Error(retErr), + slog.String("tarPath", tarPath), + slog.Bool("found", retErr == nil), + slog.Any("error", retErr), ) }() readObjectCloser, err := p.bucket.Get(ctx, tarPath) @@ -576,11 +583,12 @@ func (p *moduleDataStore) getWriteBucketAndCallbackForTar( } defer func() { p.logDebugModuleKey( + ctx, moduleKey, "module data store put tar to write bucket", - zap.String("tarPath", tarPath), - zap.Bool("found", retErr == nil), - zap.Error(retErr), + slog.String("tarPath", tarPath), + slog.Bool("found", retErr == nil), + slog.Any("error", retErr), ) }() writeObjectCloser, err := p.bucket.Put( @@ -603,8 +611,8 @@ func (p *moduleDataStore) getWriteBucketAndCallbackForTar( } } -func (p *moduleDataStore) logDebugModuleKey(moduleKey bufmodule.ModuleKey, message string, fields ...zap.Field) { - logDebugModuleKey(p.logger, moduleKey, message, fields...) +func (p *moduleDataStore) logDebugModuleKey(ctx context.Context, moduleKey bufmodule.ModuleKey, message string, fields ...any) { + logDebugModuleKey(ctx, p.logger, moduleKey, message, fields...) } // Returns the module's path within the store if storing individual files. diff --git a/private/bufpkg/bufmodule/bufmodulestore/module_data_store_test.go b/private/bufpkg/bufmodule/bufmodulestore/module_data_store_test.go index 23f66cc2b6..27ce8a2463 100644 --- a/private/bufpkg/bufmodule/bufmodulestore/module_data_store_test.go +++ b/private/bufpkg/bufmodule/bufmodulestore/module_data_store_test.go @@ -23,11 +23,11 @@ import ( "github.com/bufbuild/buf/private/pkg/filelock" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestModuleDataStoreBasicDir(t *testing.T) { @@ -72,7 +72,7 @@ func testModuleDataStore( tar bool, ) { ctx := context.Background() - logger := zap.NewNop() + logger := slogtestext.NewLogger(t) moduleDataStore := NewModuleDataStore(logger, bucket, filelocker, moduleDataStoreOptions...) moduleKeys, moduleDatas := testGetModuleKeysAndModuleDatas(t, ctx) foundModuleDatas, notFoundModuleKeys, err := moduleDataStore.GetModuleDatasForModuleKeys( diff --git a/private/bufpkg/bufmodule/bufmodulestore/util.go b/private/bufpkg/bufmodule/bufmodulestore/util.go index d33380272c..c4d6265904 100644 --- a/private/bufpkg/bufmodule/bufmodulestore/util.go +++ b/private/bufpkg/bufmodule/bufmodulestore/util.go @@ -15,36 +15,38 @@ package bufmodulestore import ( + "context" + "log/slog" + "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/uuidutil" - "go.uber.org/zap" ) -func logDebugModuleKey(logger *zap.Logger, moduleKey bufmodule.ModuleKey, message string, fields ...zap.Field) { - if checkedEntry := logger.Check(zap.DebugLevel, message); checkedEntry != nil { - checkedEntry.Write( - append( - []zap.Field{ - zap.String("moduleFullName", moduleKey.ModuleFullName().String()), - zap.String("commitID", uuidutil.ToDashless(moduleKey.CommitID())), - }, - fields..., - )..., - ) - } +func logDebugModuleKey(ctx context.Context, logger *slog.Logger, moduleKey bufmodule.ModuleKey, message string, fields ...any) { + logger.DebugContext( + ctx, + message, + append( + []any{ + slog.String("moduleFullName", moduleKey.ModuleFullName().String()), + slog.String("commitID", uuidutil.ToDashless(moduleKey.CommitID())), + }, + fields..., + )..., + ) } -func logDebugCommitKey(logger *zap.Logger, commitKey bufmodule.CommitKey, message string, fields ...zap.Field) { - if checkedEntry := logger.Check(zap.DebugLevel, message); checkedEntry != nil { - checkedEntry.Write( - append( - []zap.Field{ - zap.String("digestType", commitKey.DigestType().String()), - zap.String("registry", commitKey.Registry()), - zap.String("commitID", uuidutil.ToDashless(commitKey.CommitID())), - }, - fields..., - )..., - ) - } +func logDebugCommitKey(ctx context.Context, logger *slog.Logger, commitKey bufmodule.CommitKey, message string, fields ...any) { + logger.DebugContext( + ctx, + message, + append( + []any{ + slog.String("digestType", commitKey.DigestType().String()), + slog.String("registry", commitKey.Registry()), + slog.String("commitID", uuidutil.ToDashless(commitKey.CommitID())), + }, + fields..., + )..., + ) } diff --git a/private/bufpkg/bufmodule/bufmoduletesting/bufmoduletesting.go b/private/bufpkg/bufmodule/bufmoduletesting/bufmoduletesting.go index eed12aa0a1..8233e9cf7c 100644 --- a/private/bufpkg/bufmodule/bufmoduletesting/bufmoduletesting.go +++ b/private/bufpkg/bufmodule/bufmoduletesting/bufmoduletesting.go @@ -25,12 +25,12 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/pkg/dag" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/google/uuid" - "go.uber.org/zap" ) var ( @@ -343,7 +343,7 @@ func newModuleSet( // may be nil commitIDToCreateTime map[uuid.UUID]time.Time, ) (bufmodule.ModuleSet, error) { - moduleSetBuilder := bufmodule.NewModuleSetBuilder(context.Background(), zap.NewNop(), bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) + moduleSetBuilder := bufmodule.NewModuleSetBuilder(context.Background(), slogext.NopLogger, bufmodule.NopModuleDataProvider, bufmodule.NopCommitProvider) for i, moduleData := range moduleDatas { if err := addModuleDataToModuleSetBuilder( moduleSetBuilder, diff --git a/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-digest/digest.go b/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-digest/digest.go index 78163a5724..2be6efa25c 100644 --- a/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-digest/digest.go +++ b/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-digest/digest.go @@ -27,6 +27,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appcmd" "github.com/bufbuild/buf/private/pkg/app/appext" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/stringutil" "github.com/spf13/pflag" @@ -45,6 +46,7 @@ func newCommand() *appcmd.Command { builder := appext.NewBuilder( name, appext.BuilderWithTimeout(120*time.Second), + appext.BuilderWithLoggerProvider(slogapp.LoggerProvider), ) flags := newFlags() return &appcmd.Command{ diff --git a/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-new-commit-id/newcommitid.go b/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-new-commit-id/newcommitid.go index da003a663a..d34d35a324 100644 --- a/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-new-commit-id/newcommitid.go +++ b/private/bufpkg/bufmodule/bufmoduletesting/cmd/buf-new-commit-id/newcommitid.go @@ -20,6 +20,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app/appcmd" "github.com/bufbuild/buf/private/pkg/app/appext" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/bufbuild/buf/private/pkg/uuidutil" "github.com/spf13/pflag" ) @@ -36,6 +37,7 @@ func newCommand() *appcmd.Command { builder := appext.NewBuilder( name, appext.BuilderWithTimeout(120*time.Second), + appext.BuilderWithLoggerProvider(slogapp.LoggerProvider), ) flags := newFlags() return &appcmd.Command{ diff --git a/private/bufpkg/bufmodule/module_set_builder.go b/private/bufpkg/bufmodule/module_set_builder.go index 775641f2c0..3eb81d74d9 100644 --- a/private/bufpkg/bufmodule/module_set_builder.go +++ b/private/bufpkg/bufmodule/module_set_builder.go @@ -16,16 +16,16 @@ package bufmodule import ( "context" + "log/slog" "sync/atomic" "github.com/bufbuild/buf/private/pkg/normalpath" "github.com/bufbuild/buf/private/pkg/slicesext" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/syserror" - "github.com/bufbuild/buf/private/pkg/zaputil" "github.com/google/uuid" "go.uber.org/multierr" - "go.uber.org/zap" ) var ( @@ -114,7 +114,7 @@ type ModuleSetBuilder interface { // NewModuleSetBuilder returns a new ModuleSetBuilder. func NewModuleSetBuilder( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, moduleDataProvider ModuleDataProvider, commitProvider CommitProvider, ) ModuleSetBuilder { @@ -128,7 +128,7 @@ func NewModuleSetBuilder( // All of the remote Module's transitive dependencies are automatically added as non-targets. func NewModuleSetForRemoteModule( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, graphProvider GraphProvider, moduleDataProvider ModuleDataProvider, commitProvider CommitProvider, @@ -280,7 +280,7 @@ func RemoteModuleWithTargetPaths( type moduleSetBuilder struct { ctx context.Context - logger *zap.Logger + logger *slog.Logger moduleDataProvider ModuleDataProvider commitProvider CommitProvider @@ -291,7 +291,7 @@ type moduleSetBuilder struct { func newModuleSetBuilder( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, moduleDataProvider ModuleDataProvider, commitProvider CommitProvider, ) *moduleSetBuilder { @@ -405,7 +405,7 @@ func (b *moduleSetBuilder) AddRemoteModule( } func (b *moduleSetBuilder) Build() (ModuleSet, error) { - defer zaputil.DebugProfile(b.logger)() + defer slogext.DebugProfile(b.logger)() if !b.buildCalled.CompareAndSwap(false, true) { return nil, errBuildAlreadyCalled diff --git a/private/bufpkg/bufprotoplugin/bufprotoplugin.go b/private/bufpkg/bufprotoplugin/bufprotoplugin.go index b7620ada90..3b780e3e4b 100644 --- a/private/bufpkg/bufprotoplugin/bufprotoplugin.go +++ b/private/bufpkg/bufprotoplugin/bufprotoplugin.go @@ -22,12 +22,12 @@ package bufprotoplugin import ( "context" "fmt" + "log/slog" "path/filepath" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/protoplugin" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) @@ -57,7 +57,7 @@ type Generator interface { // NewGenerator returns a new Generator. func NewGenerator( - logger *zap.Logger, + logger *slog.Logger, handler protoplugin.Handler, ) Generator { return newGenerator(logger, handler) @@ -81,7 +81,7 @@ type ResponseWriter interface { } // NewResponseWriter returns a new ResponseWriter. -func NewResponseWriter(logger *zap.Logger) ResponseWriter { +func NewResponseWriter(logger *slog.Logger) ResponseWriter { return newResponseWriter(logger) } diff --git a/private/bufpkg/bufprotoplugin/bufprotopluginos/bufprotopluginos.go b/private/bufpkg/bufprotoplugin/bufprotopluginos/bufprotopluginos.go index 33a8e9d0ad..9ebbf204f4 100644 --- a/private/bufpkg/bufprotoplugin/bufprotopluginos/bufprotopluginos.go +++ b/private/bufpkg/bufprotoplugin/bufprotopluginos/bufprotopluginos.go @@ -18,9 +18,9 @@ package bufprotopluginos import ( "context" "io" + "log/slog" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) @@ -45,7 +45,7 @@ type ResponseWriter interface { // NewResponseWriter returns a new ResponseWriter. func NewResponseWriter( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, options ...ResponseWriterOption, ) ResponseWriter { diff --git a/private/bufpkg/bufprotoplugin/bufprotopluginos/response_writer.go b/private/bufpkg/bufprotoplugin/bufprotopluginos/response_writer.go index 480fc9c633..35db22ba06 100644 --- a/private/bufpkg/bufprotoplugin/bufprotopluginos/response_writer.go +++ b/private/bufpkg/bufprotoplugin/bufprotopluginos/response_writer.go @@ -17,6 +17,7 @@ package bufprotopluginos import ( "context" "fmt" + "log/slog" "os" "path/filepath" "sync" @@ -28,7 +29,6 @@ import ( "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/bufbuild/buf/private/pkg/storage/storageos" "go.uber.org/multierr" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) @@ -42,7 +42,7 @@ Created-By: 1.6.0 (protoc) ) type responseWriter struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider responseWriter bufprotoplugin.ResponseWriter // If set, create directories if they don't already exist. @@ -71,7 +71,7 @@ type responseWriter struct { } func newResponseWriter( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, options ...ResponseWriterOption, ) *responseWriter { diff --git a/private/bufpkg/bufprotoplugin/generator.go b/private/bufpkg/bufprotoplugin/generator.go index 523c826388..0195841479 100644 --- a/private/bufpkg/bufprotoplugin/generator.go +++ b/private/bufpkg/bufprotoplugin/generator.go @@ -18,21 +18,21 @@ import ( "context" "errors" "fmt" + "log/slog" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/thread" "github.com/bufbuild/protoplugin" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) type generator struct { - logger *zap.Logger + logger *slog.Logger handler protoplugin.Handler } func newGenerator( - logger *zap.Logger, + logger *slog.Logger, handler protoplugin.Handler, ) *generator { return &generator{ diff --git a/private/bufpkg/bufprotoplugin/response_writer.go b/private/bufpkg/bufprotoplugin/response_writer.go index 4c3f4ea713..6f3f78dcba 100644 --- a/private/bufpkg/bufprotoplugin/response_writer.go +++ b/private/bufpkg/bufprotoplugin/response_writer.go @@ -21,22 +21,22 @@ import ( "fmt" "io" "io/fs" + "log/slog" "strings" "unicode" "unicode/utf8" "github.com/bufbuild/buf/private/pkg/storage" "go.uber.org/multierr" - "go.uber.org/zap" "google.golang.org/protobuf/types/pluginpb" ) type responseWriter struct { - logger *zap.Logger + logger *slog.Logger } func newResponseWriter( - logger *zap.Logger, + logger *slog.Logger, ) *responseWriter { return &responseWriter{ logger: logger, diff --git a/private/bufpkg/bufprotosource/bufprotosource_test.go b/private/bufpkg/bufprotosource/bufprotosource_test.go index bc303383db..fba2460d38 100644 --- a/private/bufpkg/bufprotosource/bufprotosource_test.go +++ b/private/bufpkg/bufprotosource/bufprotosource_test.go @@ -21,8 +21,8 @@ import ( "github.com/bufbuild/buf/private/bufpkg/bufimage" "github.com/bufbuild/buf/private/bufpkg/bufmodule" "github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduletesting" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestNewFiles(t *testing.T) { @@ -31,7 +31,7 @@ func TestNewFiles(t *testing.T) { require.NoError(t, err) image, err := bufimage.BuildImage( context.Background(), - zap.NewNop(), + slogtestext.NewLogger(t), bufmodule.ModuleSetToModuleReadBucketWithOnlyProtoFiles(moduleSet), ) require.NoError(t, err) diff --git a/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker.go b/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker.go index 8fd3399268..1dfd14609e 100644 --- a/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker.go +++ b/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker.go @@ -21,6 +21,7 @@ import ( "errors" "fmt" "io" + "log/slog" "regexp" "strings" "sync" @@ -34,7 +35,6 @@ import ( "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/stringid" "go.uber.org/multierr" - "go.uber.org/zap" ) const ( @@ -104,7 +104,7 @@ type InspectResponse struct { type dockerAPIClient struct { cli *client.Client - logger *zap.Logger + logger *slog.Logger lock sync.RWMutex // protects negotiated negotiated bool } @@ -134,11 +134,11 @@ func (d *dockerAPIClient) Load(ctx context.Context, image io.Reader) (_ *LoadRes continue } if !strings.HasPrefix(loadedImageID, "sha256:") { - d.logger.Warn("Unsupported image digest", zap.String("imageID", loadedImageID)) + d.logger.Warn("Unsupported image digest", slog.String("imageID", loadedImageID)) continue } if err := imagev1.ValidateID(strings.TrimPrefix(loadedImageID, "sha256:")); err != nil { - d.logger.Warn("Invalid image id", zap.String("imageID", loadedImageID)) + d.logger.Warn("Invalid image id", slog.String("imageID", loadedImageID)) continue } imageID = loadedImageID @@ -185,7 +185,7 @@ func (d *dockerAPIClient) Push(ctx context.Context, image string, auth *Registry var imageDigest string pushScanner := bufio.NewScanner(pushReader) for pushScanner.Scan() { - d.logger.Debug(pushScanner.Text()) + d.logger.DebugContext(ctx, pushScanner.Text()) var message jsonmessage.JSONMessage if err := json.Unmarshal([]byte(pushScanner.Text()), &message); err == nil { if message.Error != nil { @@ -200,7 +200,7 @@ func (d *dockerAPIClient) Push(ctx context.Context, image string, auth *Registry if len(imageDigest) == 0 { return nil, fmt.Errorf("failed to determine image digest after push") } - d.logger.Debug("docker image digest", zap.String("imageDigest", imageDigest)) + d.logger.DebugContext(ctx, "docker image digest", slog.String("imageDigest", imageDigest)) return &PushResponse{Digest: imageDigest}, nil } @@ -276,7 +276,7 @@ func (d *dockerAPIClient) negotiateVersion(ctx context.Context) error { } // NewClient creates a new Client to use to build Docker plugins. -func NewClient(logger *zap.Logger, cliVersion string, options ...ClientOption) (Client, error) { +func NewClient(logger *slog.Logger, cliVersion string, options ...ClientOption) (Client, error) { if logger == nil { return nil, errors.New("logger required") } diff --git a/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker_test.go b/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker_test.go index 431993d6f4..a60c9f5c5d 100644 --- a/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker_test.go +++ b/private/bufpkg/bufremoteplugin/bufremoteplugindocker/docker_test.go @@ -34,6 +34,7 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/docker/docker/api/types" dockerimage "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" @@ -41,7 +42,6 @@ import ( "github.com/docker/docker/pkg/stringid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" ) @@ -131,9 +131,7 @@ func assertImageDigestFromStatusString(t *testing.T, status string, expectedDige func createClient(t testing.TB, options ...ClientOption) Client { t.Helper() - logger, err := zap.NewDevelopment() - require.Nilf(t, err, "failed to create zap logger") - dockerClient, err := NewClient(logger, "buf-cli-1.11.0", options...) + dockerClient, err := NewClient(slogtestext.NewLogger(t), "buf-cli-1.11.0", options...) require.Nilf(t, err, "failed to create client") t.Cleanup(func() { if err := dockerClient.Close(); err != nil { diff --git a/private/pkg/app/appext/appext.go b/private/pkg/app/appext/appext.go index dd9f0c0a46..b3e49a3a21 100644 --- a/private/pkg/app/appext/appext.go +++ b/private/pkg/app/appext/appext.go @@ -19,6 +19,7 @@ import ( "context" "errors" "fmt" + "log/slog" "net" "os" "path/filepath" @@ -27,8 +28,6 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/encoding" "github.com/spf13/pflag" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) const ( @@ -41,6 +40,8 @@ const ( // Application name foo-bar translates to environment variable prefix FOO_BAR_, which is // used for the various functions that NameContainer provides. type NameContainer interface { + app.Container + // AppName is the application name. // // The name must be in [a-zA-Z0-9-_]. @@ -75,36 +76,33 @@ type NameContainer interface { // NewNameContainer returns a new NameContainer. // // The name must be in [a-zA-Z0-9-_]. -func NewNameContainer(envContainer app.EnvContainer, appName string) (NameContainer, error) { - return newNameContainer(envContainer, appName) +func NewNameContainer(baseContainer app.Container, appName string) (NameContainer, error) { + return newNameContainer(baseContainer, appName) } -// LoggerContainer provides a *zap.Logger. +// LoggerContainer provides a *slog.Logger. type LoggerContainer interface { - Logger() *zap.Logger + Logger() *slog.Logger } // NewLoggerContainer returns a new LoggerContainer. -func NewLoggerContainer(logger *zap.Logger) LoggerContainer { +func NewLoggerContainer(logger *slog.Logger) LoggerContainer { return newLoggerContainer(logger) } // Container contains not just the base app container, but all extended containers. type Container interface { - app.Container NameContainer LoggerContainer } // NewContainer returns a new Container. func NewContainer( - baseContainer app.Container, - appName string, - logger *zap.Logger, -) (Container, error) { + nameContainer NameContainer, + logger *slog.Logger, +) Container { return newContainer( - baseContainer, - appName, + nameContainer, logger, ) } @@ -145,10 +143,15 @@ func BuilderWithInterceptor(interceptor Interceptor) BuilderOption { } } -// BuilderWithDefaultLogLevel adds the given default log level. -func BuilderWithDefaultLogLevel(defaultLogLevel zapcore.Level) BuilderOption { +// LoggerProvider provides new Loggers. +type LoggerProvider func(NameContainer, LogLevel, LogFormat) (*slog.Logger, error) + +// BuilderWithLoggerProvider overrides the default LoggerProvider. +// +// The default is to use slogbuild. +func BuilderWithLoggerProvider(loggerProvider LoggerProvider) BuilderOption { return func(builder *builder) { - builder.defaultLogLevel = defaultLogLevel + builder.loggerProvider = loggerProvider } } @@ -164,7 +167,7 @@ func ReadConfig(container NameContainer, value interface{}) error { if err != nil { return fmt.Errorf("could not read %s configuration file at %s: %w", container.AppName(), configFilePath, err) } - if err := encoding.UnmarshalYAMLStrict(data, value); err != nil { + if err := encoding.UnmarshalYAMLNonStrict(data, value); err != nil { return fmt.Errorf("invalid %s configuration file: %w", container.AppName(), err) } } diff --git a/private/pkg/app/appext/builder.go b/private/pkg/app/appext/builder.go index dfa982e5dd..95089cf12d 100644 --- a/private/pkg/app/appext/builder.go +++ b/private/pkg/app/appext/builder.go @@ -17,17 +17,14 @@ package appext import ( "context" "fmt" + "log/slog" "os" "time" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/thread" - "github.com/bufbuild/buf/private/pkg/zaputil" "github.com/pkg/profile" "github.com/spf13/pflag" - "go.uber.org/multierr" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" ) type builder struct { @@ -49,14 +46,14 @@ type builder struct { defaultTimeout time.Duration - // 0 is InfoLevel in zap - defaultLogLevel zapcore.Level - interceptors []Interceptor + interceptors []Interceptor + loggerProvider LoggerProvider } func newBuilder(appName string, options ...BuilderOption) *builder { builder := &builder{ - appName: appName, + appName: appName, + loggerProvider: defaultLoggerProvider, } for _, option := range options { option(builder) @@ -111,21 +108,23 @@ func (b *builder) run( appContainer app.Container, f func(context.Context, Container) error, ) (retErr error) { - logLevel, err := getLogLevel(b.defaultLogLevel, b.debug, b.noWarn) + logLevel, err := getLogLevel(b.debug, b.noWarn) if err != nil { return err } - logger, err := zaputil.NewLoggerForFlagValues(appContainer.Stderr(), logLevel, b.logFormat) + logFormat, err := ParseLogFormat(b.logFormat) if err != nil { return err } - defer func() { - retErr = multierr.Append(retErr, logger.Sync()) - }() - container, err := newContainer(appContainer, b.appName, logger) + nameContainer, err := newNameContainer(appContainer, b.appName) if err != nil { return err } + logger, err := b.loggerProvider(nameContainer, logLevel, logFormat) + if err != nil { + return err + } + container := newContainer(nameContainer, logger) if b.parallelism > 0 { thread.SetParallelism(b.parallelism) @@ -141,6 +140,7 @@ func (b *builder) run( return f(ctx, container) } return runProfile( + ctx, logger, b.profilePath, b.profileType, @@ -154,7 +154,8 @@ func (b *builder) run( // runProfile profiles the function. func runProfile( - logger *zap.Logger, + ctx context.Context, + logger *slog.Logger, profilePath string, profileType string, profileLoops int, @@ -168,7 +169,7 @@ func runProfile( return err } } - logger.Debug("profile", zap.String("path", profilePath)) + logger.DebugContext(ctx, "profile", slog.String("path", profilePath)) if profileType == "" { profileType = "cpu" } @@ -204,17 +205,28 @@ func runProfile( return nil } -func getLogLevel(defaultLogLevel zapcore.Level, debugFlag bool, noWarnFlag bool) (string, error) { +func getLogLevel(debugFlag bool, noWarnFlag bool) (LogLevel, error) { if debugFlag && noWarnFlag { - return "", fmt.Errorf("cannot set both --debug and --no-warn") + return 0, fmt.Errorf("cannot set both --debug and --no-warn") } if noWarnFlag { - return "error", nil + return LogLevelError, nil } if debugFlag { - return "debug", nil + return LogLevelDebug, nil + } + return LogLevelInfo, nil +} + +func defaultLoggerProvider(container NameContainer, logLevel LogLevel, logFormat LogFormat) (*slog.Logger, error) { + switch logFormat { + case LogFormatText, LogFormatColor: + return slog.New(slog.NewTextHandler(container.Stderr(), &slog.HandlerOptions{Level: logLevel.SlogLevel()})), nil + case LogFormatJSON: + return slog.New(slog.NewJSONHandler(container.Stderr(), &slog.HandlerOptions{Level: logLevel.SlogLevel()})), nil + default: + return nil, fmt.Errorf("unknown appext.LogFormat: %v", logFormat) } - return defaultLogLevel.String(), nil } // chainInterceptors consolidates the given interceptors into one. diff --git a/private/pkg/app/appext/container.go b/private/pkg/app/appext/container.go index 4d6fecd1e7..61399845c5 100644 --- a/private/pkg/app/appext/container.go +++ b/private/pkg/app/appext/container.go @@ -15,28 +15,20 @@ package appext import ( - "github.com/bufbuild/buf/private/pkg/app" - "go.uber.org/zap" + "log/slog" ) type container struct { - app.Container NameContainer LoggerContainer } func newContainer( - baseContainer app.Container, - appName string, - logger *zap.Logger, -) (*container, error) { - nameContainer, err := newNameContainer(baseContainer, appName) - if err != nil { - return nil, err - } + nameContainer NameContainer, + logger *slog.Logger, +) *container { return &container{ - Container: baseContainer, NameContainer: nameContainer, LoggerContainer: newLoggerContainer(logger), - }, nil + } } diff --git a/private/pkg/app/appext/log_format.go b/private/pkg/app/appext/log_format.go new file mode 100644 index 0000000000..e6d265e779 --- /dev/null +++ b/private/pkg/app/appext/log_format.go @@ -0,0 +1,67 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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 appext + +import ( + "fmt" + "strconv" + "strings" +) + +const ( + // LogFormatText is the text log format. + LogFormatText LogFormat = iota + 1 + // LogFormatColor is the colored text log format. + // + // This is the default value when parsing LogFormats. However, unless BuilderWithLoggerProvider + // is used, there is no difference between LogFormatText and LogFormatColor. + LogFormatColor + // LogFormatJSON is the JSON log format. + LogFormatJSON +) + +// LogFormat is a format to print logs in. +type LogFormat int + +// String implements fmt.Stringer +func (l LogFormat) String() string { + switch l { + case LogFormatText: + return "text" + case LogFormatColor: + return "color" + case LogFormatJSON: + return "json" + default: + return strconv.Itoa(int(l)) + } +} + +// ParseLogFormat parses the log format for the string. +// +// If logFormatString is empty, this returns LogFormatColor. +func ParseLogFormat(logFormatString string) (LogFormat, error) { + logFormatString = strings.TrimSpace(strings.ToLower(logFormatString)) + switch logFormatString { + case "text": + return LogFormatText, nil + case "color", "": + return LogFormatColor, nil + case "json": + return LogFormatJSON, nil + default: + return 0, fmt.Errorf("unknown log format [text,color,json]: %q", logFormatString) + } +} diff --git a/private/pkg/app/appext/log_level.go b/private/pkg/app/appext/log_level.go new file mode 100644 index 0000000000..3a14f33b19 --- /dev/null +++ b/private/pkg/app/appext/log_level.go @@ -0,0 +1,97 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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 appext + +import ( + "fmt" + "log/slog" + "strconv" + "strings" +) + +const ( + // LogLevelDebug is the debug log level. + LogLevelDebug LogLevel = iota + 1 + // LogLevelInfo is the infolog level. + LogLevelInfo + // LogLevelWarn is the warn log level. + LogLevelWarn + // LogLevelError is the error log level. + LogLevelError +) + +// LogLevel is a level to print logs in. +type LogLevel int + +// String implements fmt.Stringer +func (l LogLevel) String() string { + switch l { + case LogLevelDebug: + return "debug" + case LogLevelInfo: + return "info" + case LogLevelWarn: + return "warn" + case LogLevelError: + return "error" + default: + return strconv.Itoa(int(l)) + } +} + +// SlogLevel returns the corresponding slog.Level. +// +// If l is known, this return the corresponding value. +// If l < LogLevelDebug, this returns slog.LevelDebug. +// If l > LogLevelError, this returns slog.LevelError. +// Otherwise, this returns slog.LevelInfo. +func (l LogLevel) SlogLevel() slog.Level { + switch l { + case LogLevelDebug: + return slog.LevelDebug + case LogLevelInfo: + return slog.LevelInfo + case LogLevelWarn: + return slog.LevelWarn + case LogLevelError: + return slog.LevelError + } + if l < LogLevelDebug { + return slog.LevelDebug + } + if l > LogLevelError { + return slog.LevelError + } + return slog.LevelInfo +} + +// ParseLogLevel parses the log level for the string. +// +// If logLevelString is empty, this returns LogLevelInfo. +func ParseLogLevel(logLevelString string) (LogLevel, error) { + logLevelString = strings.TrimSpace(strings.ToLower(logLevelString)) + switch logLevelString { + case "debug": + return LogLevelDebug, nil + case "info", "": + return LogLevelInfo, nil + case "warn": + return LogLevelWarn, nil + case "error": + return LogLevelError, nil + default: + return 0, fmt.Errorf("unknown log level [debug,info,warn,error]: %q", logLevelString) + } +} diff --git a/private/pkg/app/appext/logger_container.go b/private/pkg/app/appext/logger_container.go index 19265155c5..bbc79ee5ff 100644 --- a/private/pkg/app/appext/logger_container.go +++ b/private/pkg/app/appext/logger_container.go @@ -15,19 +15,19 @@ package appext import ( - "go.uber.org/zap" + "log/slog" ) type loggerContainer struct { - logger *zap.Logger + logger *slog.Logger } -func newLoggerContainer(logger *zap.Logger) *loggerContainer { +func newLoggerContainer(logger *slog.Logger) *loggerContainer { return &loggerContainer{ logger: logger, } } -func (c *loggerContainer) Logger() *zap.Logger { +func (c *loggerContainer) Logger() *slog.Logger { return c.logger } diff --git a/private/pkg/app/appext/name_container.go b/private/pkg/app/appext/name_container.go index ef22aac215..f0337d6af5 100644 --- a/private/pkg/app/appext/name_container.go +++ b/private/pkg/app/appext/name_container.go @@ -26,8 +26,9 @@ import ( ) type nameContainer struct { - envContainer app.EnvContainer - appName string + app.Container + + appName string configDirPath string configDirPathOnce sync.Once @@ -40,13 +41,13 @@ type nameContainer struct { portOnce sync.Once } -func newNameContainer(envContainer app.EnvContainer, appName string) (*nameContainer, error) { +func newNameContainer(baseContainer app.Container, appName string) (*nameContainer, error) { if err := validateAppName(appName); err != nil { return nil, err } return &nameContainer{ - envContainer: envContainer, - appName: appName, + Container: baseContainer, + appName: appName, }, nil } @@ -91,9 +92,9 @@ func (c *nameContainer) setPort() { } func (c *nameContainer) getDirPath(envSuffix string, getBaseDirPath func(app.EnvContainer) (string, error)) string { - dirPath := c.envContainer.Env(getAppNameEnvPrefix(c.appName) + envSuffix) + dirPath := c.Container.Env(getAppNameEnvPrefix(c.appName) + envSuffix) if dirPath == "" { - baseDirPath, err := getBaseDirPath(c.envContainer) + baseDirPath, err := getBaseDirPath(c.Container) if err == nil { dirPath = filepath.Join(baseDirPath, c.appName) } @@ -102,9 +103,9 @@ func (c *nameContainer) getDirPath(envSuffix string, getBaseDirPath func(app.Env } func (c *nameContainer) getPort() (uint16, error) { - portString := c.envContainer.Env(getAppNameEnvPrefix(c.appName) + "PORT") + portString := c.Container.Env(getAppNameEnvPrefix(c.appName) + "PORT") if portString == "" { - portString = c.envContainer.Env("PORT") + portString = c.Container.Env("PORT") if portString == "" { return 0, nil } diff --git a/private/pkg/app/appext/name_container_unix_test.go b/private/pkg/app/appext/name_container_unix_test.go index 633761833c..0f018813ef 100644 --- a/private/pkg/app/appext/name_container_unix_test.go +++ b/private/pkg/app/appext/name_container_unix_test.go @@ -115,7 +115,7 @@ func TestPort4(t *testing.T) { } func testPort(t *testing.T, appName string, env map[string]string, expected uint16) { - container, err := NewNameContainer(app.NewEnvContainer(env), appName) + container, err := NewNameContainer(testNewContainer(env), appName) require.NoError(t, err) port, err := container.Port() require.NoError(t, err) @@ -125,7 +125,7 @@ func testPort(t *testing.T, appName string, env map[string]string, expected uint func testRoundTrip(t *testing.T, appName string, env map[string]string, dirPath string) { _, err := os.Lstat(filepath.Join(dirPath, configFileName)) require.Error(t, err) - container, err := NewNameContainer(app.NewEnvContainer(env), appName) + container, err := NewNameContainer(testNewContainer(env), appName) require.NoError(t, err) inputTestConfig := &testConfig{Bar: "one", Baz: "two"} err = WriteConfig(container, inputTestConfig) @@ -138,6 +138,10 @@ func testRoundTrip(t *testing.T, appName string, env map[string]string, dirPath require.Equal(t, inputTestConfig, outputTestConfig) } +func testNewContainer(env map[string]string) app.Container { + return app.NewContainer(env, nil, nil, nil, "test") +} + type testConfig struct { Bar string Baz string diff --git a/private/pkg/bandeps/bandeps.go b/private/pkg/bandeps/bandeps.go index e8f7f5bee7..ba7cc195b2 100644 --- a/private/pkg/bandeps/bandeps.go +++ b/private/pkg/bandeps/bandeps.go @@ -17,10 +17,10 @@ package bandeps import ( "context" "fmt" + "log/slog" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" - "go.uber.org/zap" ) // Checker is a checker. @@ -33,7 +33,7 @@ type Checker interface { ) ([]Violation, error) } -func NewChecker(logger *zap.Logger, runner command.Runner) Checker { +func NewChecker(logger *slog.Logger, runner command.Runner) Checker { return newChecker(logger, runner) } diff --git a/private/pkg/bandeps/checker.go b/private/pkg/bandeps/checker.go index 3afa72e4d1..7f8160f2e1 100644 --- a/private/pkg/bandeps/checker.go +++ b/private/pkg/bandeps/checker.go @@ -16,20 +16,20 @@ package bandeps import ( "context" + "log/slog" "sync" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/thread" - "go.uber.org/zap" ) type checker struct { - logger *zap.Logger + logger *slog.Logger runner command.Runner } -func newChecker(logger *zap.Logger, runner command.Runner) *checker { +func newChecker(logger *slog.Logger, runner command.Runner) *checker { return &checker{ logger: logger, runner: runner, diff --git a/private/pkg/bandeps/cmd/bandeps/main.go b/private/pkg/bandeps/cmd/bandeps/main.go index ad3efe09dd..be156ec6d6 100644 --- a/private/pkg/bandeps/cmd/bandeps/main.go +++ b/private/pkg/bandeps/cmd/bandeps/main.go @@ -26,6 +26,7 @@ import ( "github.com/bufbuild/buf/private/pkg/bandeps" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/encoding" + "github.com/bufbuild/buf/private/pkg/slogapp" "github.com/spf13/pflag" ) @@ -46,6 +47,7 @@ func newCommand() *appcmd.Command { builder := appext.NewBuilder( name, appext.BuilderWithTimeout(timeout), + appext.BuilderWithLoggerProvider(slogapp.LoggerProvider), ) flags := newFlags() return &appcmd.Command{ diff --git a/private/pkg/bandeps/state.go b/private/pkg/bandeps/state.go index 879b8f41b7..ffe877ecc9 100644 --- a/private/pkg/bandeps/state.go +++ b/private/pkg/bandeps/state.go @@ -16,16 +16,16 @@ package bandeps import ( "context" + "log/slog" "sync" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/slicesext" - "go.uber.org/zap" ) type state struct { - logger *zap.Logger + logger *slog.Logger envStdioContainer app.EnvStdioContainer runner command.Runner violationMap map[string]Violation @@ -41,7 +41,7 @@ type state struct { } func newState( - logger *zap.Logger, + logger *slog.Logger, envStdioContainer app.EnvStdioContainer, runner command.Runner, ) *state { @@ -113,7 +113,7 @@ func (s *state) packagesForPackageExpression( ) (map[string]struct{}, error) { defer func() { // not worrying about locks - s.logger.Debug("cache", zap.Int("calls", s.calls), zap.Int("hits", s.cacheHits)) + s.logger.DebugContext(ctx, "cache", slog.Int("calls", s.calls), slog.Int("hits", s.cacheHits)) }() s.packageExpressionToPackagesLock.RLock(packageExpression) @@ -168,7 +168,7 @@ func (s *state) depsForPackage( ) (map[string]struct{}, error) { defer func() { // not worrying about locks - s.logger.Debug("cache", zap.Int("calls", s.calls), zap.Int("hits", s.cacheHits)) + s.logger.DebugContext(ctx, "cache", slog.Int("calls", s.calls), slog.Int("hits", s.cacheHits)) }() s.packageToDepsLock.RLock(pkg) diff --git a/private/pkg/git/cloner.go b/private/pkg/git/cloner.go index 3bd61a9754..f891af6ca6 100644 --- a/private/pkg/git/cloner.go +++ b/private/pkg/git/cloner.go @@ -19,28 +19,28 @@ import ( "context" "errors" "fmt" + "log/slog" "strconv" "strings" "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" + "github.com/bufbuild/buf/private/pkg/slogext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/bufbuild/buf/private/pkg/tmp" - "github.com/bufbuild/buf/private/pkg/zaputil" "go.uber.org/multierr" - "go.uber.org/zap" ) type cloner struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider runner command.Runner options ClonerOptions } func newCloner( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, options ClonerOptions, @@ -61,7 +61,7 @@ func (c *cloner) CloneToBucket( writeBucket storage.WriteBucket, options CloneToBucketOptions, ) (retErr error) { - defer zaputil.DebugProfile(c.logger)() + defer slogext.DebugProfile(c.logger)() var err error switch { diff --git a/private/pkg/git/git.go b/private/pkg/git/git.go index fd9731fc83..04c950d6af 100644 --- a/private/pkg/git/git.go +++ b/private/pkg/git/git.go @@ -20,6 +20,7 @@ import ( "context" "errors" "fmt" + "log/slog" "os/exec" "regexp" "strings" @@ -28,7 +29,6 @@ import ( "github.com/bufbuild/buf/private/pkg/command" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" ) const ( @@ -101,7 +101,7 @@ type CloneToBucketOptions struct { // NewCloner returns a new Cloner. func NewCloner( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, runner command.Runner, options ClonerOptions, diff --git a/private/pkg/git/git_test.go b/private/pkg/git/git_test.go index f15da66f91..b9091c5b15 100644 --- a/private/pkg/git/git_test.go +++ b/private/pkg/git/git_test.go @@ -29,12 +29,12 @@ import ( "github.com/bufbuild/buf/private/pkg/app" "github.com/bufbuild/buf/private/pkg/command" + "github.com/bufbuild/buf/private/pkg/slogtestext" "github.com/bufbuild/buf/private/pkg/storage" "github.com/bufbuild/buf/private/pkg/storage/storagemem" "github.com/bufbuild/buf/private/pkg/storage/storageos" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestGitCloner(t *testing.T) { @@ -305,7 +305,7 @@ func TestGitCloner(t *testing.T) { func readBucketForName(ctx context.Context, t *testing.T, runner command.Runner, path string, depth uint32, name Name, recurseSubmodules bool) storage.ReadBucket { t.Helper() storageosProvider := storageos.NewProvider(storageos.ProviderWithSymlinks()) - cloner := NewCloner(zap.NewNop(), storageosProvider, runner, ClonerOptions{}) + cloner := NewCloner(slogtestext.NewLogger(t), storageosProvider, runner, ClonerOptions{}) envContainer, err := app.NewEnvContainerForOS() require.NoError(t, err) diff --git a/private/pkg/github/githubtesting/archive_reader.go b/private/pkg/github/githubtesting/archive_reader.go index 24c636d694..6428a2cb87 100644 --- a/private/pkg/github/githubtesting/archive_reader.go +++ b/private/pkg/github/githubtesting/archive_reader.go @@ -18,6 +18,7 @@ import ( "compress/gzip" "context" "fmt" + "log/slog" "net/http" "os" "sync" @@ -28,7 +29,6 @@ import ( "github.com/bufbuild/buf/private/pkg/storage/storagearchive" "github.com/bufbuild/buf/private/pkg/storage/storageos" "go.uber.org/multierr" - "go.uber.org/zap" ) // since we are in testing, we care less about making sure this times out early @@ -37,14 +37,14 @@ import ( const filelockTimeout = 10 * time.Second type archiveReader struct { - logger *zap.Logger + logger *slog.Logger storageosProvider storageos.Provider httpClient *http.Client lock sync.Mutex } func newArchiveReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, ) *archiveReader { diff --git a/private/pkg/github/githubtesting/githubtesting.go b/private/pkg/github/githubtesting/githubtesting.go index 41a36c2850..ea998fcb74 100644 --- a/private/pkg/github/githubtesting/githubtesting.go +++ b/private/pkg/github/githubtesting/githubtesting.go @@ -17,10 +17,10 @@ package githubtesting import ( "context" + "log/slog" "net/http" "github.com/bufbuild/buf/private/pkg/storage/storageos" - "go.uber.org/zap" ) // ArchiveReader reads GitHub archives. @@ -46,7 +46,7 @@ type ArchiveReader interface { // NewArchiveReader returns a new ArchiveReader. func NewArchiveReader( - logger *zap.Logger, + logger *slog.Logger, storageosProvider storageos.Provider, httpClient *http.Client, ) ArchiveReader { diff --git a/private/pkg/slogapp/slogapp.go b/private/pkg/slogapp/slogapp.go new file mode 100644 index 0000000000..858c8f02cd --- /dev/null +++ b/private/pkg/slogapp/slogapp.go @@ -0,0 +1,39 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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 slogapp builds slog.Loggers. +package slogapp + +import ( + "io" + "log/slog" + + "github.com/bufbuild/buf/private/pkg/app/appext" + "github.com/bufbuild/buf/private/pkg/zapapp" + "go.uber.org/zap/exp/zapslog" +) + +// LoggerProvider is an appext.LoggerProvider for use with appext.BuilderWithLoggerProvider. +func LoggerProvider(container appext.NameContainer, logLevel appext.LogLevel, logFormat appext.LogFormat) (*slog.Logger, error) { + return NewLogger(container.Stderr(), logLevel, logFormat) +} + +// NewLogger returns a new Logger for the given level and format. +func NewLogger(writer io.Writer, logLevel appext.LogLevel, logFormat appext.LogFormat) (*slog.Logger, error) { + core, err := zapapp.NewCore(writer, logLevel, logFormat) + if err != nil { + return nil, err + } + return slog.New(zapslog.NewHandler(core)), nil +} diff --git a/private/pkg/zaputil/usage.gen.go b/private/pkg/slogapp/usage.gen.go similarity index 97% rename from private/pkg/zaputil/usage.gen.go rename to private/pkg/slogapp/usage.gen.go index c25818a759..ef994061fc 100644 --- a/private/pkg/zaputil/usage.gen.go +++ b/private/pkg/slogapp/usage.gen.go @@ -14,6 +14,6 @@ // Generated. DO NOT EDIT. -package zaputil +package slogapp import _ "github.com/bufbuild/buf/private/usage" diff --git a/private/pkg/slogext/slogext.go b/private/pkg/slogext/slogext.go new file mode 100644 index 0000000000..e4c5206ada --- /dev/null +++ b/private/pkg/slogext/slogext.go @@ -0,0 +1,95 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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 slogext implements extended functionality for slog. +package slogext + +import ( + "context" + "log/slog" + "runtime" + "time" +) + +var ( + // NopLogger is a no-op Logger. + NopLogger = slog.New(NopHandler) + // NopHandler is no-op Handler. + NopHandler slog.Handler = nopHandler{} +) + +// ErrorAttr returns a slog.Attr for the error. +// +// If err is nil, this returns slog.Attr{}. +func ErrorAttr(err error) slog.Attr { + if err == nil { + return slog.Attr{} + } + return slog.Any("error", err) +} + +// DebugProfile will result in the function's elapsed time being printed as a debug log line. +func DebugProfile(logger *slog.Logger, extraFields ...any) func() { + message := getRuntimeFrame(2).Function + start := time.Now() + return func() { + logger.Debug( + message, + append( + []any{ + slog.Duration("duration", time.Since(start)), + }, + extraFields..., + )..., + ) + } +} + +// *** PRIVATE *** + +type nopHandler struct{} + +func (nopHandler) Enabled(context.Context, slog.Level) bool { + return false +} + +func (nopHandler) Handle(context.Context, slog.Record) error { + return nil +} + +func (n nopHandler) WithAttrs([]slog.Attr) slog.Handler { + return n +} + +func (n nopHandler) WithGroup(string) slog.Handler { + return n +} + +func getRuntimeFrame(skipFrames int) runtime.Frame { + targetFrameIndex := skipFrames + 2 + programCounters := make([]uintptr, targetFrameIndex+2) + n := runtime.Callers(0, programCounters) + var frame runtime.Frame + if n > 0 { + frames := runtime.CallersFrames(programCounters[:n]) + for more, frameIndex := true, 0; more && frameIndex <= targetFrameIndex; frameIndex++ { + var frameCandidate runtime.Frame + frameCandidate, more = frames.Next() + if frameIndex == targetFrameIndex { + frame = frameCandidate + } + } + } + return frame +} diff --git a/private/pkg/slogext/usage.gen.go b/private/pkg/slogext/usage.gen.go new file mode 100644 index 0000000000..563cc5dab5 --- /dev/null +++ b/private/pkg/slogext/usage.gen.go @@ -0,0 +1,19 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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. + +// Generated. DO NOT EDIT. + +package slogext + +import _ "github.com/bufbuild/buf/private/usage" diff --git a/private/pkg/slogtestext/slogtestext.go b/private/pkg/slogtestext/slogtestext.go new file mode 100644 index 0000000000..4b3cb02e46 --- /dev/null +++ b/private/pkg/slogtestext/slogtestext.go @@ -0,0 +1,61 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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 slogtestext provides Loggers for testing. +package slogtestext + +import ( + "log/slog" + "os" + "testing" + + "github.com/bufbuild/buf/private/pkg/app/appext" + "github.com/bufbuild/buf/private/pkg/slogapp" + "github.com/stretchr/testify/require" +) + +// NewLogger returns a new Logger for testing. +func NewLogger(t testing.TB, options ...LoggerOption) *slog.Logger { + loggerOptions := newLoggerOptions() + for _, option := range options { + option(loggerOptions) + } + logger, err := slogapp.NewLogger(os.Stderr, loggerOptions.logLevel, appext.LogFormatText) + require.NoError(t, err) + return logger +} + +// LoggerOption is an option for a new testing Logger. +type LoggerOption func(*loggerOptions) + +// WithLogLevel specifies the LogLevel to use for the Logger. +// +// The default is appext.LogLevelDebug. +func WithLogLevel(logLevel appext.LogLevel) LoggerOption { + return func(loggerOptions *loggerOptions) { + loggerOptions.logLevel = logLevel + } +} + +// *** PRIVATE *** + +type loggerOptions struct { + logLevel appext.LogLevel +} + +func newLoggerOptions() *loggerOptions { + return &loggerOptions{ + logLevel: appext.LogLevelDebug, + } +} diff --git a/private/pkg/slogtestext/usage.gen.go b/private/pkg/slogtestext/usage.gen.go new file mode 100644 index 0000000000..427820a0cb --- /dev/null +++ b/private/pkg/slogtestext/usage.gen.go @@ -0,0 +1,19 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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. + +// Generated. DO NOT EDIT. + +package slogtestext + +import _ "github.com/bufbuild/buf/private/usage" diff --git a/private/pkg/transport/http/httpserver/httpserver.go b/private/pkg/transport/http/httpserver/httpserver.go index 2b1aaf1141..67a9496778 100644 --- a/private/pkg/transport/http/httpserver/httpserver.go +++ b/private/pkg/transport/http/httpserver/httpserver.go @@ -17,12 +17,12 @@ package httpserver import ( "context" "crypto/tls" + "log/slog" "net" "net/http" "time" "github.com/go-chi/chi/v5" - "go.uber.org/zap" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "golang.org/x/sync/errgroup" @@ -103,7 +103,7 @@ func RunWithoutH2C() RunOption { // The Run function can be configured further by passing a variety of options. func Run( ctx context.Context, - logger *zap.Logger, + logger *slog.Logger, listener net.Listener, handler http.Handler, options ...RunOption, @@ -115,14 +115,10 @@ func Run( for _, option := range options { option(s) } - stdLogger, err := zap.NewStdLogAt(logger.Named("httpserver"), zap.ErrorLevel) - if err != nil { - return err - } httpServer := &http.Server{ Handler: handler, ReadHeaderTimeout: s.readHeaderTimeout, - ErrorLog: stdLogger, + ErrorLog: slog.NewLogLogger(logger.Handler(), slog.LevelError), TLSConfig: s.tlsConfig, } if s.tlsConfig == nil && !s.disableH2C { @@ -146,9 +142,9 @@ func Run( eg.Go(func() error { <-ctx.Done() start := time.Now() - logger.Info("shutdown_starting", zap.Duration("shutdown_timeout", s.shutdownTimeout)) + logger.Info("shutdown_starting", slog.Duration("shutdown_timeout", s.shutdownTimeout)) defer func() { - logger.Info("shutdown_finished", zap.Duration("duration", time.Since(start))) + logger.Info("shutdown_finished", slog.Duration("duration", time.Since(start))) }() if s.shutdownTimeout != 0 { ctx, cancel := context.WithTimeout(context.Background(), s.shutdownTimeout) @@ -160,9 +156,9 @@ func Run( logger.Info( "starting", - zap.String("address", listener.Addr().String()), - zap.Duration("shutdown_timeout", s.shutdownTimeout), - zap.Bool("tls", s.tlsConfig != nil), + slog.String("address", listener.Addr().String()), + slog.Duration("shutdown_timeout", s.shutdownTimeout), + slog.Bool("tls", s.tlsConfig != nil), ) if err := eg.Wait(); err != http.ErrServerClosed { return err diff --git a/private/pkg/zapapp/usage.gen.go b/private/pkg/zapapp/usage.gen.go new file mode 100644 index 0000000000..98b5e8662e --- /dev/null +++ b/private/pkg/zapapp/usage.gen.go @@ -0,0 +1,19 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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. + +// Generated. DO NOT EDIT. + +package zapapp + +import _ "github.com/bufbuild/buf/private/usage" diff --git a/private/pkg/zaputil/vars.go b/private/pkg/zapapp/vars.go similarity index 99% rename from private/pkg/zaputil/vars.go rename to private/pkg/zapapp/vars.go index e2d11b8a35..8f492043df 100644 --- a/private/pkg/zaputil/vars.go +++ b/private/pkg/zapapp/vars.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package zaputil +package zapapp import ( "go.uber.org/zap/zapcore" diff --git a/private/pkg/zapapp/zapapp.go b/private/pkg/zapapp/zapapp.go new file mode 100644 index 0000000000..db55991255 --- /dev/null +++ b/private/pkg/zapapp/zapapp.go @@ -0,0 +1,82 @@ +// Copyright 2020-2024 Buf Technologies, Inc. +// +// 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 zapapp builds zap.Loggers. +package zapapp + +import ( + "fmt" + "io" + + "github.com/bufbuild/buf/private/pkg/app/appext" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// NewCoreForFlagValues returns a new Core for the given level and format strings. +func NewCore(writer io.Writer, logLevel appext.LogLevel, logFormat appext.LogFormat) (zapcore.Core, error) { + level, err := getLevel(logLevel) + if err != nil { + return nil, err + } + encoder, err := getEncoder(logFormat) + if err != nil { + return nil, err + } + return zapcore.NewCore( + encoder, + zapcore.Lock(zapcore.AddSync(writer)), + zap.NewAtomicLevelAt(level), + ), nil +} + +func getLevel(logLevel appext.LogLevel) (zapcore.Level, error) { + switch logLevel { + case appext.LogLevelDebug: + return zapcore.DebugLevel, nil + case appext.LogLevelInfo: + return zapcore.InfoLevel, nil + case appext.LogLevelWarn: + return zapcore.WarnLevel, nil + case appext.LogLevelError: + return zapcore.ErrorLevel, nil + default: + return 0, fmt.Errorf("unknown appext.LogLevel: %v", logLevel) + } +} + +func getEncoder(logFormat appext.LogFormat) (zapcore.Encoder, error) { + switch logFormat { + case appext.LogFormatText: + return newTextEncoder(), nil + case appext.LogFormatColor: + return newColortextEncoder(), nil + case appext.LogFormatJSON: + return newJSONEncoder(), nil + default: + return nil, fmt.Errorf("unknown appext.LogFormat: %v", logFormat) + } +} + +func newTextEncoder() zapcore.Encoder { + return zapcore.NewConsoleEncoder(textEncoderConfig) +} + +func newColortextEncoder() zapcore.Encoder { + return zapcore.NewConsoleEncoder(colortextEncoderConfig) +} + +func newJSONEncoder() zapcore.Encoder { + return zapcore.NewJSONEncoder(jsonEncoderConfig) +} diff --git a/private/pkg/zaputil/zaputil.go b/private/pkg/zaputil/zaputil.go deleted file mode 100644 index 1c6111ae6d..0000000000 --- a/private/pkg/zaputil/zaputil.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2020-2024 Buf Technologies, Inc. -// -// 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 zaputil implements utilities for zap. -package zaputil - -import ( - "fmt" - "io" - "runtime" - "strings" - "time" - - "go.uber.org/zap" - "go.uber.org/zap/zapcore" -) - -// DebugProfile will result in the function's elapsed time being printed as a debug log line. -func DebugProfile(logger *zap.Logger, extraFields ...zap.Field) func() { - message := getRuntimeFrame(2).Function - start := time.Now() - return func() { - logger.Debug( - message, - append( - []zap.Field{ - zap.Duration("duration", time.Since(start)), - }, - extraFields..., - )..., - ) - } -} - -// NewLogger returns a new Logger. -func NewLogger( - writer io.Writer, - level zapcore.Level, - encoder zapcore.Encoder, -) *zap.Logger { - return zap.New( - zapcore.NewCore( - encoder, - zapcore.Lock(zapcore.AddSync(writer)), - zap.NewAtomicLevelAt(level), - ), - ) -} - -// NewLoggerForFlagValues returns a new Logger for the given level and format strings. -// -// The level can be [debug,info,warn,error]. The default is info. -// The format can be [text,color,json]. The default is color. -func NewLoggerForFlagValues(writer io.Writer, levelString string, format string) (*zap.Logger, error) { - level, err := getZapLevel(levelString) - if err != nil { - return nil, err - } - encoder, err := getZapEncoder(format) - if err != nil { - return nil, err - } - return NewLogger(writer, level, encoder), nil -} - -// NewTextEncoder returns a new text Encoder. -func NewTextEncoder() zapcore.Encoder { - return zapcore.NewConsoleEncoder(textEncoderConfig) -} - -// NewColortextEncoder returns a new colortext Encoder. -func NewColortextEncoder() zapcore.Encoder { - return zapcore.NewConsoleEncoder(colortextEncoderConfig) -} - -// NewJSONEncoder returns a new JSON encoder. -func NewJSONEncoder() zapcore.Encoder { - return zapcore.NewJSONEncoder(jsonEncoderConfig) -} - -func getZapLevel(level string) (zapcore.Level, error) { - level = strings.TrimSpace(strings.ToLower(level)) - switch level { - case "debug": - return zapcore.DebugLevel, nil - case "info", "": - return zapcore.InfoLevel, nil - case "warn": - return zapcore.WarnLevel, nil - case "error": - return zapcore.ErrorLevel, nil - default: - return 0, fmt.Errorf("unknown log level [debug,info,warn,error]: %q", level) - } -} - -func getZapEncoder(format string) (zapcore.Encoder, error) { - format = strings.TrimSpace(strings.ToLower(format)) - switch format { - case "text": - return NewTextEncoder(), nil - case "color", "": - return NewColortextEncoder(), nil - case "json": - return NewJSONEncoder(), nil - default: - return nil, fmt.Errorf("unknown log format [text,color,json]: %q", format) - } -} - -func getRuntimeFrame(skipFrames int) runtime.Frame { - targetFrameIndex := skipFrames + 2 - programCounters := make([]uintptr, targetFrameIndex+2) - n := runtime.Callers(0, programCounters) - var frame runtime.Frame - if n > 0 { - frames := runtime.CallersFrames(programCounters[:n]) - for more, frameIndex := true, 0; more && frameIndex <= targetFrameIndex; frameIndex++ { - var frameCandidate runtime.Frame - frameCandidate, more = frames.Next() - if frameIndex == targetFrameIndex { - frame = frameCandidate - } - } - } - return frame -} diff --git a/private/pkg/zaputil/zaputil_test.go b/private/pkg/zaputil/zaputil_test.go deleted file mode 100644 index ceae1f5925..0000000000 --- a/private/pkg/zaputil/zaputil_test.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2020-2024 Buf Technologies, Inc. -// -// 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 zaputil - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - "go.uber.org/zap/zapcore" -) - -func TestGetZapLevel(t *testing.T) { - t.Parallel() - testCases := []struct { - levelString string - expected zapcore.Level - expectError bool - }{ - {"debug", zapcore.DebugLevel, false}, - {"info", zapcore.InfoLevel, false}, - {"warn", zapcore.WarnLevel, false}, - {"error", zapcore.ErrorLevel, false}, - {"", zapcore.InfoLevel, false}, - {"foobar", zapcore.InfoLevel, true}, - } - - for _, tc := range testCases { - actual, err := getZapLevel(tc.levelString) - if tc.expectError && err == nil { - t.Errorf("Expected error for level %q but got none", tc.levelString) - } else if !tc.expectError && err != nil { - t.Errorf("Unexpected error for level %q: %s", tc.levelString, err) - } - if actual != tc.expected { - t.Errorf("For level %q expected %v but got %v", tc.levelString, tc.expected, actual) - } - } -} - -func TestGetZapEncoder(t *testing.T) { - t.Parallel() - // Test valid formats - testCases := []struct { - format string - }{ - {"text"}, - {"color"}, - {"json"}, - {"TEXT"}, - {"COLOR"}, - {"JSON"}, - } - for _, tc := range testCases { - tc := tc - t.Run(fmt.Sprintf("valid format %s", tc.format), func(t *testing.T) { - t.Parallel() - encoder, err := getZapEncoder(tc.format) - assert.NoError(t, err) - assert.NotNil(t, encoder) - }) - } - - // Test unknown format - unknownFormat := "invalid" - _, err := getZapEncoder(unknownFormat) - assert.EqualError(t, err, fmt.Sprintf("unknown log format [text,color,json]: %q", unknownFormat)) -}