From 4ec87f36a7c689235e82362101458f44f97b5a8b Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 1 Mar 2024 02:06:12 +0800 Subject: [PATCH 1/6] Fix bug with issues [17464] fix with zap logger redirection Signed-off-by: Colin --- client/pkg/logutil/zap.go | 27 +++++++++++++++++++++++ etcdctl/ctlv3/command/snapshot_command.go | 5 +---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/client/pkg/logutil/zap.go b/client/pkg/logutil/zap.go index 2b83c6963..41d09cccf 100644 --- a/client/pkg/logutil/zap.go +++ b/client/pkg/logutil/zap.go @@ -15,6 +15,7 @@ package logutil import ( + "os" "sort" "time" @@ -33,6 +34,32 @@ func CreateDefaultZapLogger(level zapcore.Level) (*zap.Logger, error) { return c, nil } +// CreateDefaultZapLogger creates a logger with default zap configuration can redirect log to /dev/null +func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { + infoLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { + return level == zapcore.InfoLevel + }) + errorFatalLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { + return level == zapcore.ErrorLevel || level == zapcore.FatalLevel + }) + stdoutSyncer := zapcore.Lock(os.Stdout) + stderrSyncer := zapcore.Lock(os.Stderr) + core := zapcore.NewTee( + zapcore.NewCore( + zapcore.NewJSONEncoder(DefaultZapLoggerConfig.EncoderConfig), + stdoutSyncer, + infoLevel, + ), + zapcore.NewCore( + zapcore.NewJSONEncoder(DefaultZapLoggerConfig.EncoderConfig), + stderrSyncer, + errorFatalLevel, + ), + ) + logger := zap.New(core) + return logger +} + // DefaultZapLoggerConfig defines default zap logger configuration. var DefaultZapLoggerConfig = zap.Config{ Level: zap.NewAtomicLevelAt(ConvertToZapLevel(DefaultLogLevel)), diff --git a/etcdctl/ctlv3/command/snapshot_command.go b/etcdctl/ctlv3/command/snapshot_command.go index df317e23c..491fb2988 100644 --- a/etcdctl/ctlv3/command/snapshot_command.go +++ b/etcdctl/ctlv3/command/snapshot_command.go @@ -50,10 +50,7 @@ func snapshotSaveCommandFunc(cmd *cobra.Command, args []string) { cobrautl.ExitWithError(cobrautl.ExitBadArgs, err) } - lg, err := logutil.CreateDefaultZapLogger(zap.InfoLevel) - if err != nil { - cobrautl.ExitWithError(cobrautl.ExitError, err) - } + lg := logutil.CreateUtilZapLogger(zap.InfoLevel) cfg := mustClientCfgFromCmd(cmd) // if user does not specify "--command-timeout" flag, there will be no timeout for snapshot save command From d402b1bfff718e1dbbbe54131913a8d8ca245ed1 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 1 Mar 2024 08:36:11 +0800 Subject: [PATCH 2/6] fix CreateUtilZapLogger comment Signed-off-by: Colin --- client/pkg/logutil/zap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/pkg/logutil/zap.go b/client/pkg/logutil/zap.go index 41d09cccf..b839ee2a5 100644 --- a/client/pkg/logutil/zap.go +++ b/client/pkg/logutil/zap.go @@ -34,7 +34,7 @@ func CreateDefaultZapLogger(level zapcore.Level) (*zap.Logger, error) { return c, nil } -// CreateDefaultZapLogger creates a logger with default zap configuration can redirect log to /dev/null +// CreateUtilZapLogger creates a logger with default zap configuration can redirect log to /dev/null func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { infoLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { return level == zapcore.InfoLevel From 7f757e8576de05a85554854385f14fae3143ceb4 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 1 Mar 2024 19:22:13 +0800 Subject: [PATCH 3/6] handle level parameters Signed-off-by: Colin --- client/pkg/logutil/zap.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/pkg/logutil/zap.go b/client/pkg/logutil/zap.go index b839ee2a5..8cc68f32e 100644 --- a/client/pkg/logutil/zap.go +++ b/client/pkg/logutil/zap.go @@ -36,6 +36,8 @@ func CreateDefaultZapLogger(level zapcore.Level) (*zap.Logger, error) { // CreateUtilZapLogger creates a logger with default zap configuration can redirect log to /dev/null func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { + lcfg := DefaultZapLoggerConfig + lcfg.Level = zap.NewAtomicLevelAt(level) infoLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { return level == zapcore.InfoLevel }) @@ -46,12 +48,12 @@ func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { stderrSyncer := zapcore.Lock(os.Stderr) core := zapcore.NewTee( zapcore.NewCore( - zapcore.NewJSONEncoder(DefaultZapLoggerConfig.EncoderConfig), + zapcore.NewJSONEncoder(lcfg.EncoderConfig), stdoutSyncer, infoLevel, ), zapcore.NewCore( - zapcore.NewJSONEncoder(DefaultZapLoggerConfig.EncoderConfig), + zapcore.NewJSONEncoder(lcfg.EncoderConfig), stderrSyncer, errorFatalLevel, ), From 43f751c50430217cd4cccb77508bc023f38be3b5 Mon Sep 17 00:00:00 2001 From: Colin Date: Fri, 1 Mar 2024 20:27:11 +0800 Subject: [PATCH 4/6] add log caller Signed-off-by: Colin --- client/pkg/logutil/zap.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/client/pkg/logutil/zap.go b/client/pkg/logutil/zap.go index 8cc68f32e..47d52ca57 100644 --- a/client/pkg/logutil/zap.go +++ b/client/pkg/logutil/zap.go @@ -38,6 +38,12 @@ func CreateDefaultZapLogger(level zapcore.Level) (*zap.Logger, error) { func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { lcfg := DefaultZapLoggerConfig lcfg.Level = zap.NewAtomicLevelAt(level) + lcfg.Development = false + lcfg.Encoding = DefaultLogFormat + lcfg.Sampling = &zap.SamplingConfig{ + Initial: 100, + Thereafter: 100, + } infoLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { return level == zapcore.InfoLevel }) @@ -58,8 +64,7 @@ func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { errorFatalLevel, ), ) - logger := zap.New(core) - return logger + return zap.New(core, zap.AddCaller()) } // DefaultZapLoggerConfig defines default zap logger configuration. From 3c40d6036631f16d79dc15a68db941303fa56365 Mon Sep 17 00:00:00 2001 From: Colin Date: Sun, 28 Apr 2024 22:37:29 +0800 Subject: [PATCH 5/6] Optimize current code, fix with more commands Signed-off-by: Colin --- client/pkg/logutil/zap.go | 42 +++++++++++------------ etcdctl/ctlv3/command/ep_command.go | 4 +-- etcdctl/ctlv3/command/global.go | 4 +-- etcdctl/ctlv3/command/snapshot_command.go | 5 ++- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/client/pkg/logutil/zap.go b/client/pkg/logutil/zap.go index 47d52ca57..26f548fed 100644 --- a/client/pkg/logutil/zap.go +++ b/client/pkg/logutil/zap.go @@ -35,36 +35,34 @@ func CreateDefaultZapLogger(level zapcore.Level) (*zap.Logger, error) { } // CreateUtilZapLogger creates a logger with default zap configuration can redirect log to /dev/null -func CreateUtilZapLogger(level zapcore.Level) *zap.Logger { +func CreateUtilZapLogger(level zapcore.Level) (*zap.Logger, error) { lcfg := DefaultZapLoggerConfig lcfg.Level = zap.NewAtomicLevelAt(level) - lcfg.Development = false - lcfg.Encoding = DefaultLogFormat - lcfg.Sampling = &zap.SamplingConfig{ - Initial: 100, - Thereafter: 100, - } infoLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { - return level == zapcore.InfoLevel + return level <= zapcore.InfoLevel }) errorFatalLevel := zap.LevelEnablerFunc(func(level zapcore.Level) bool { - return level == zapcore.ErrorLevel || level == zapcore.FatalLevel + return level > zapcore.InfoLevel }) stdoutSyncer := zapcore.Lock(os.Stdout) stderrSyncer := zapcore.Lock(os.Stderr) - core := zapcore.NewTee( - zapcore.NewCore( - zapcore.NewJSONEncoder(lcfg.EncoderConfig), - stdoutSyncer, - infoLevel, - ), - zapcore.NewCore( - zapcore.NewJSONEncoder(lcfg.EncoderConfig), - stderrSyncer, - errorFatalLevel, - ), - ) - return zap.New(core, zap.AddCaller()) + opts := []zap.Option{ + zap.WrapCore(func(core zapcore.Core) zapcore.Core { + return zapcore.NewTee( + zapcore.NewCore( + zapcore.NewJSONEncoder(lcfg.EncoderConfig), + stdoutSyncer, + infoLevel, + ), + zapcore.NewCore( + zapcore.NewJSONEncoder(lcfg.EncoderConfig), + stderrSyncer, + errorFatalLevel, + ), + ) + }), + } + return lcfg.Build(opts...) } // DefaultZapLoggerConfig defines default zap logger configuration. diff --git a/etcdctl/ctlv3/command/ep_command.go b/etcdctl/ctlv3/command/ep_command.go index 2fb017c1f..b6c82db1e 100644 --- a/etcdctl/ctlv3/command/ep_command.go +++ b/etcdctl/ctlv3/command/ep_command.go @@ -89,7 +89,7 @@ type epHealth struct { // epHealthCommandFunc executes the "endpoint-health" command. func epHealthCommandFunc(cmd *cobra.Command, args []string) { - lg, err := logutil.CreateDefaultZapLogger(zap.InfoLevel) + lg, err := logutil.CreateUtilZapLogger(zap.InfoLevel) if err != nil { cobrautl.ExitWithError(cobrautl.ExitError, err) } @@ -267,7 +267,7 @@ func endpointsFromCluster(cmd *cobra.Command) []string { cobrautl.ExitWithError(cobrautl.ExitError, err) } // exclude auth for not asking needless password (MemberList() doesn't need authentication) - lg, _ := logutil.CreateDefaultZapLogger(zap.InfoLevel) + lg, _ := logutil.CreateUtilZapLogger(zap.InfoLevel) cfg, err := clientv3.NewClientConfig(&clientv3.ConfigSpec{ Endpoints: eps, DialTimeout: dt, diff --git a/etcdctl/ctlv3/command/global.go b/etcdctl/ctlv3/command/global.go index 93b62068a..1c705f87a 100644 --- a/etcdctl/ctlv3/command/global.go +++ b/etcdctl/ctlv3/command/global.go @@ -89,7 +89,7 @@ func (*discardValue) Set(string) error { return nil } func (*discardValue) Type() string { return "" } func clientConfigFromCmd(cmd *cobra.Command) *clientv3.ConfigSpec { - lg, err := logutil.CreateDefaultZapLogger(zap.InfoLevel) + lg, err := logutil.CreateUtilZapLogger(zap.InfoLevel) if err != nil { cobrautl.ExitWithError(cobrautl.ExitError, err) } @@ -152,7 +152,7 @@ func mustClientFromCmd(cmd *cobra.Command) *clientv3.Client { } func mustClient(cc *clientv3.ConfigSpec) *clientv3.Client { - lg, _ := logutil.CreateDefaultZapLogger(zap.InfoLevel) + lg, _ := logutil.CreateUtilZapLogger(zap.InfoLevel) cfg, err := clientv3.NewClientConfig(cc, lg) if err != nil { cobrautl.ExitWithError(cobrautl.ExitBadArgs, err) diff --git a/etcdctl/ctlv3/command/snapshot_command.go b/etcdctl/ctlv3/command/snapshot_command.go index 491fb2988..08f2dbd9a 100644 --- a/etcdctl/ctlv3/command/snapshot_command.go +++ b/etcdctl/ctlv3/command/snapshot_command.go @@ -50,7 +50,10 @@ func snapshotSaveCommandFunc(cmd *cobra.Command, args []string) { cobrautl.ExitWithError(cobrautl.ExitBadArgs, err) } - lg := logutil.CreateUtilZapLogger(zap.InfoLevel) + lg, err := logutil.CreateUtilZapLogger(zap.InfoLevel) + if err != nil { + cobrautl.ExitWithError(cobrautl.ExitError, err) + } cfg := mustClientCfgFromCmd(cmd) // if user does not specify "--command-timeout" flag, there will be no timeout for snapshot save command From de12c6651702f032af63acd6c33e5bf5fabda18c Mon Sep 17 00:00:00 2001 From: Colin Date: Tue, 7 May 2024 22:35:05 +0800 Subject: [PATCH 6/6] Call CreateUtilZapLogger in function mustClientCfgFromCmd Signed-off-by: Colin --- etcdctl/ctlv3/command/global.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etcdctl/ctlv3/command/global.go b/etcdctl/ctlv3/command/global.go index 1c705f87a..3638a7e05 100644 --- a/etcdctl/ctlv3/command/global.go +++ b/etcdctl/ctlv3/command/global.go @@ -138,7 +138,7 @@ func clientConfigFromCmd(cmd *cobra.Command) *clientv3.ConfigSpec { func mustClientCfgFromCmd(cmd *cobra.Command) *clientv3.Config { cc := clientConfigFromCmd(cmd) - lg, _ := logutil.CreateDefaultZapLogger(zap.InfoLevel) + lg, _ := logutil.CreateUtilZapLogger(zap.InfoLevel) cfg, err := clientv3.NewClientConfig(cc, lg) if err != nil { cobrautl.ExitWithError(cobrautl.ExitBadArgs, err)