diff --git a/client/v3/client.go b/client/v3/client.go index b2210a589da..2c3f3fede33 100644 --- a/client/v3/client.go +++ b/client/v3/client.go @@ -99,6 +99,9 @@ func NewFromURLs(urls []string) (*Client, error) { } // WithLogger overrides the logger. +// +// Deprecated: Please use Logger field in clientv3.Config +// // Does not changes grpcLogger, that can be explicitly configured // using grpc_zap.ReplaceGrpcLoggerV2(..) method. func (c *Client) WithLogger(lg *zap.Logger) *Client { @@ -331,7 +334,9 @@ func newClient(cfg *Config) (*Client, error) { } var err error - if cfg.LogConfig != nil { + if cfg.Logger != nil { + client.lg = cfg.Logger + } else if cfg.LogConfig != nil { client.lg, err = cfg.LogConfig.Build() } else { client.lg, err = createDefaultZapLogger() diff --git a/client/v3/client_test.go b/client/v3/client_test.go index 882c82a00bb..a15dbbff761 100644 --- a/client/v3/client_test.go +++ b/client/v3/client_test.go @@ -29,11 +29,8 @@ import ( ) func NewClient(t *testing.T, cfg Config) (*Client, error) { - client, err := New(cfg) - if err != nil { - return nil, err - } - return client.WithLogger(zaptest.NewLogger(t)), nil + cfg.Logger = zaptest.NewLogger(t) + return New(cfg) } func TestDialCancel(t *testing.T) { diff --git a/client/v3/config.go b/client/v3/config.go index 11d447d5756..335a288732b 100644 --- a/client/v3/config.go +++ b/client/v3/config.go @@ -76,6 +76,10 @@ type Config struct { // other operations that do not have an explicit context. Context context.Context + // Logger sets client-side logger. + // If nil, fallback to building LogConfig. + Logger *zap.Logger + // LogConfig configures client-side logger. // If nil, use the default logger. // TODO: configure gRPC logger diff --git a/client/v3/snapshot/v3_snapshot.go b/client/v3/snapshot/v3_snapshot.go index 41902769dfa..b6eb592dda3 100644 --- a/client/v3/snapshot/v3_snapshot.go +++ b/client/v3/snapshot/v3_snapshot.go @@ -47,6 +47,7 @@ func Save(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, dbPath strin if lg == nil { lg = zap.NewExample() } + cfg.Logger = lg.Named("client") if len(cfg.Endpoints) != 1 { return fmt.Errorf("snapshot must be requested to one selected node, not multiple %v", cfg.Endpoints) } @@ -56,8 +57,6 @@ func Save(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, dbPath strin } defer cli.Close() - cli = cli.WithLogger(lg.Named("client")) - partpath := dbPath + ".part" defer os.RemoveAll(partpath) diff --git a/etcdctl/ctlv3/command/ep_command.go b/etcdctl/ctlv3/command/ep_command.go index 8c31004c688..3f591e6800c 100644 --- a/etcdctl/ctlv3/command/ep_command.go +++ b/etcdctl/ctlv3/command/ep_command.go @@ -115,12 +115,12 @@ func epHealthCommandFunc(cmd *cobra.Command, args []string) { go func(cfg *v3.Config) { defer wg.Done() ep := cfg.Endpoints[0] + cfg.Logger = lg.Named("client") cli, err := v3.New(*cfg) if err != nil { hch <- epHealth{Ep: ep, Health: false, Error: err.Error()} return } - cli = cli.WithLogger(lg.Named("client")) st := time.Now() // get a random key. As long as we can get the response without an error, the // endpoint is health. diff --git a/server/etcdmain/grpc_proxy.go b/server/etcdmain/grpc_proxy.go index cff13a5dfb4..e251e1825a8 100644 --- a/server/etcdmain/grpc_proxy.go +++ b/server/etcdmain/grpc_proxy.go @@ -283,17 +283,18 @@ func mustNewClient(lg *zap.Logger) *clientv3.Client { grpc.WithUnaryInterceptor(grpcproxy.AuthUnaryClientInterceptor)) cfg.DialOptions = append(cfg.DialOptions, grpc.WithStreamInterceptor(grpcproxy.AuthStreamClientInterceptor)) + cfg.Logger = lg.Named("client") client, err := clientv3.New(*cfg) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } - return client.WithLogger(lg.Named("client")) + return client } func mustNewProxyClient(lg *zap.Logger, tls *transport.TLSInfo) *clientv3.Client { eps := []string{grpcProxyAdvertiseClientURL} - cfg, err := newProxyClientCfg(lg, eps, tls) + cfg, err := newProxyClientCfg(lg.Named("client"), eps, tls) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -304,13 +305,14 @@ func mustNewProxyClient(lg *zap.Logger, tls *transport.TLSInfo) *clientv3.Client os.Exit(1) } lg.Info("create proxy client", zap.String("grpcProxyAdvertiseClientURL", grpcProxyAdvertiseClientURL)) - return client.WithLogger(lg.Named("client")) + return client } func newProxyClientCfg(lg *zap.Logger, eps []string, tls *transport.TLSInfo) (*clientv3.Config, error) { cfg := clientv3.Config{ Endpoints: eps, DialTimeout: 5 * time.Second, + Logger: lg, } if tls != nil { clientTLS, err := tls.ClientConfig() diff --git a/tests/integration/clientv3/connectivity/network_partition_test.go b/tests/integration/clientv3/connectivity/network_partition_test.go index ee8bbf9f2e0..0e050e2f94e 100644 --- a/tests/integration/clientv3/connectivity/network_partition_test.go +++ b/tests/integration/clientv3/connectivity/network_partition_test.go @@ -119,13 +119,13 @@ func testBalancerUnderNetworkPartition(t *testing.T, op func(*clientv3.Client, c Endpoints: []string{eps[0]}, DialTimeout: 3 * time.Second, DialOptions: []grpc.DialOption{grpc.WithBlock()}, + Logger: zaptest.NewLogger(t).Named("client"), } cli, err := integration.NewClient(t, ccfg) if err != nil { t.Fatal(err) } defer cli.Close() - cli = cli.WithLogger(zaptest.NewLogger(t).Named("client")) // wait for eps[0] to be pinned clientv3test.MustWaitPinReady(t, cli) diff --git a/tests/integration/cluster_direct.go b/tests/integration/cluster_direct.go index a7070de0e70..67daf7caeab 100644 --- a/tests/integration/cluster_direct.go +++ b/tests/integration/cluster_direct.go @@ -41,9 +41,6 @@ func toGRPC(c *clientv3.Client) grpcAPI { } func newClientV3(cfg clientv3.Config, lg *zap.Logger) (*clientv3.Client, error) { - c, err := clientv3.New(cfg) - if err != nil { - return nil, err - } - return c.WithLogger(lg), nil + cfg.Logger = lg + return clientv3.New(cfg) } diff --git a/tests/integration/cluster_proxy.go b/tests/integration/cluster_proxy.go index 97a9808e634..e8549eea3f7 100644 --- a/tests/integration/cluster_proxy.go +++ b/tests/integration/cluster_proxy.go @@ -109,11 +109,11 @@ func (pc *proxyCloser) Close() error { } func newClientV3(cfg clientv3.Config, lg *zap.Logger) (*clientv3.Client, error) { + cfg.Logger = lg c, err := clientv3.New(cfg) if err != nil { return nil, err } - c = c.WithLogger(lg) rpc := toGRPC(c) c.KV = clientv3.NewKVFromKVClient(rpc.KV, c) pmu.Lock() diff --git a/tests/integration/embed/embed_test.go b/tests/integration/embed/embed_test.go index ddb3808c9a5..c04bf97c961 100644 --- a/tests/integration/embed/embed_test.go +++ b/tests/integration/embed/embed_test.go @@ -35,7 +35,6 @@ import ( "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/server/v3/embed" "go.etcd.io/etcd/tests/v3/integration" - "go.uber.org/zap/zaptest" ) var ( @@ -167,8 +166,6 @@ func testEmbedEtcdGracefulStop(t *testing.T, secure bool) { } defer cli.Close() - cli = cli.WithLogger(zaptest.NewLogger(t)) - // open watch connection cli.Watch(context.Background(), "foo") diff --git a/tests/integration/testing.go b/tests/integration/testing.go index d7a2323c4f1..7b1dfffea46 100644 --- a/tests/integration/testing.go +++ b/tests/integration/testing.go @@ -73,9 +73,8 @@ func NewEmbedConfig(t testing.TB, name string) *embed.Config { } func NewClient(t testing.TB, cfg clientv3.Config) (*clientv3.Client, error) { - client, err := clientv3.New(cfg) - if err != nil { - return nil, err + if cfg.Logger != nil { + cfg.Logger = zaptest.NewLogger(t) } - return client.WithLogger(zaptest.NewLogger(t)), nil + return clientv3.New(cfg) }