From 2d2b9d449e204555b4a162c4b43be5352eeef259 Mon Sep 17 00:00:00 2001 From: Evan Baker Date: Thu, 20 Feb 2025 01:43:30 +0000 Subject: [PATCH] fix: zapetw core with fields Signed-off-by: Evan Baker --- cni/log/logger_windows.go | 2 +- cns/logger/cnslogger_windows.go | 2 +- zapetw/core_windows.go | 40 +++++++++++++++++++-------------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/cni/log/logger_windows.go b/cni/log/logger_windows.go index 2ac46204f0..7b7586f77f 100644 --- a/cni/log/logger_windows.go +++ b/cni/log/logger_windows.go @@ -26,7 +26,7 @@ func etwCore(loggingLevel zapcore.Level) (zapcore.Core, error) { encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder jsonEncoder := zapcore.NewJSONEncoder(encoderConfig) - etwcore, err := zapetw.NewETWCore(etwCNIEventName, jsonEncoder, loggingLevel) + etwcore, _, err := zapetw.New("ACN-Monitoring", etwCNIEventName, jsonEncoder, loggingLevel) if err != nil { return nil, errors.Wrap(err, "failed to create ETW core") } diff --git a/cns/logger/cnslogger_windows.go b/cns/logger/cnslogger_windows.go index b909991178..f1b3e6263e 100644 --- a/cns/logger/cnslogger_windows.go +++ b/cns/logger/cnslogger_windows.go @@ -19,7 +19,7 @@ func getPlatformCores(loggingLevel zapcore.Level, encoder zapcore.Encoder) (zapc } func getETWCore(loggingLevel zapcore.Level, encoder zapcore.Encoder) (zapcore.Core, error) { - etwcore, err := zapetw.NewETWCore(etwCNSEventName, encoder, loggingLevel) + etwcore, _, err := zapetw.New("ACN-Monitoring", etwCNSEventName, encoder, loggingLevel) if err != nil { return nil, errors.Wrap(err, "failed to create ETW core") } diff --git a/zapetw/core_windows.go b/zapetw/core_windows.go index 955b1149f6..699cb8bd24 100644 --- a/zapetw/core_windows.go +++ b/zapetw/core_windows.go @@ -9,48 +9,45 @@ import ( // - const providername = "ACN-Monitoring" -type ETWCore struct { +type Core struct { provider *etw.Provider eventName string encoder zapcore.Encoder - fields []zapcore.Field zapcore.LevelEnabler } -func NewETWCore(eventName string, encoder zapcore.Encoder, levelEnabler zapcore.LevelEnabler) (*ETWCore, error) { - provider, err := etw.NewProviderWithOptions(providername) +func New(providerName, eventName string, encoder zapcore.Encoder, levelEnabler zapcore.LevelEnabler) (zapcore.Core, func(), error) { + provider, err := etw.NewProviderWithOptions(providerName) if err != nil { - return nil, errors.Wrap(err, "failed to create ETW provider") + return nil, func() { _ = provider.Close() }, errors.Wrap(err, "failed to create ETW provider") } - return &ETWCore{ + return &Core{ provider: provider, eventName: eventName, encoder: encoder, LevelEnabler: levelEnabler, - }, nil + }, func() { _ = provider.Close() }, nil } -func (core *ETWCore) With(fields []zapcore.Field) zapcore.Core { - return &ETWCore{ - provider: core.provider, - eventName: core.eventName, - encoder: core.encoder, - LevelEnabler: core.LevelEnabler, - fields: append(core.fields, fields...), +func (core *Core) With(fields []zapcore.Field) zapcore.Core { + clone := core.clone() + for i := range fields { + fields[i].AddTo(clone.encoder) } + return clone } // Check is an implementation of the zapcore.Core interface's Check method. // Check determines whether the logger core is enabled at the supplied zapcore.Entry's Level. // If enabled, it adds the core to the CheckedEntry and returns it, otherwise returns the CheckedEntry unchanged. -func (core *ETWCore) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry { +func (core *Core) Check(entry zapcore.Entry, checkedEntry *zapcore.CheckedEntry) *zapcore.CheckedEntry { if core.Enabled(entry.Level) { return checkedEntry.AddCore(entry, core) } return checkedEntry } -func (core *ETWCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { +func (core *Core) Write(entry zapcore.Entry, fields []zapcore.Field) error { etwLevel := zapLevelToETWLevel(entry.Level) buffer, err := core.encoder.EncodeEntry(entry, fields) @@ -70,10 +67,19 @@ func (core *ETWCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { return nil } -func (core *ETWCore) Sync() error { +func (core *Core) Sync() error { return nil } +func (core *Core) clone() *Core { + return &Core{ + provider: core.provider, + eventName: core.eventName, + encoder: core.encoder.Clone(), + LevelEnabler: core.LevelEnabler, + } +} + func zapLevelToETWLevel(level zapcore.Level) etw.Level { switch level { case zapcore.DebugLevel: