From 4d21a0cfa411e58c933b52842a2cf15cf756ea6e Mon Sep 17 00:00:00 2001 From: simitt Date: Mon, 28 Dec 2020 11:11:37 +0100 Subject: [PATCH 1/2] add: ecszap.WrapCoreOption closes #15 --- CHANGELOG.md | 12 +++++++++++- README.md | 9 +++++++++ core.go | 9 +++++++-- logger_test.go | 30 ++++++++---------------------- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d4c238..e7d2135 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,17 @@ # CHANGELOG Changelog for ecszap -## 0.2.0 (unreleased) +## unreleased + +### Enhancement +* Add `ecszap.WrapCoreOption` for convenience [pull#22](https://github.com/elastic/ecs-logging-go-zap/pull/22) + +## 0.3.0 + +### Enhancement +* Update ECS version to 1.6.0 [pull#17](https://github.com/elastic/ecs-logging-go-zap/pull/17) + +## 0.2.0 ### Enhancement * Add `ecszap.ECSCompatibleEncoderConfig` for making existing encoder config ECS conformant [pull#12](https://github.com/elastic/ecs-logging-go-zap/pull/12) diff --git a/README.md b/README.md index 52dbaba..7e833cd 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,8 @@ logger := zap.New(core, zap.AddCaller()) ``` ### Transition from existing configurations +Depending on your needs there are different ways how to create the logger: + ```go encoderConfig := ecszap.ECSCompatibleEncoderConfig(zap.NewDevelopmentEncoderConfig()) encoder := zapcore.NewJSONEncoder(encoderConfig) @@ -138,6 +140,13 @@ core := zapcore.NewCore(encoder, os.Stdout, zap.DebugLevel) logger := zap.New(ecszap.WrapCore(core), zap.AddCaller()) ``` +```go +config := zap.NewProductionConfig() +config.EncoderConfig = ecszap.ECSCompatibleEncoderConfig(config.EncoderConfig) +logger, err := config.Build(ecszap.WrapCoreOption()) +``` + + ## References * Introduction to ECS [blog post](https://www.elastic.co/blog/introducing-the-elastic-common-schema). * Logs UI [blog post](https://www.elastic.co/blog/infrastructure-and-logs-ui-new-ways-for-ops-to-interact-with-elasticsearch). diff --git a/core.go b/core.go index 618c6fb..4a6aec7 100644 --- a/core.go +++ b/core.go @@ -33,14 +33,19 @@ func NewCore(cfg EncoderConfig, ws zapcore.WriteSyncer, enab zapcore.LevelEnable return WrapCore(zapcore.NewCore(enc, ws, enab)) } -// WrapCore wraps a given core with ECS core functionality. For ECS -// compatibility, ensure that the wrapped zapcore.Core uses an encoder +// WrapCore wraps a core with ECS core functionality and returns a zapcore.Core. +// For ECS compatibility, ensure that the wrapped zapcore.Core uses an encoder // that is created from an ECS compatible configuration. For further details // check out ecszap.EncoderConfig or ecszap.ECSCompatibleEncoderConfig. func WrapCore(c zapcore.Core) zapcore.Core { return &core{c} } +// WrapCoreOption returns a zap.Option, wrapping the underlying zapcore.Core. +func WrapCoreOption() zap.Option { + return zap.WrapCore(WrapCore) +} + type core struct { zapcore.Core } diff --git a/logger_test.go b/logger_test.go index 071415f..8183b27 100644 --- a/logger_test.go +++ b/logger_test.go @@ -24,8 +24,6 @@ import ( "go.uber.org/zap/zapcore" - errs "github.com/pkg/errors" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -61,7 +59,7 @@ func TestECSZapLogger_With(t *testing.T) { }{ {name: "newCoreFromConfig", core: NewCore(NewDefaultEncoderConfig(), &out, zap.DebugLevel)}, - {name: "", + {name: "wrappedCore", core: func() zapcore.Core { ecsEncCfg := ECSCompatibleEncoderConfig(zap.NewProductionEncoderConfig()) enc := zapcore.NewJSONEncoder(ecsEncCfg) @@ -81,17 +79,19 @@ func TestECSZapLogger_With(t *testing.T) { // log a wrapped error out.reset() - err := errors.New("boom") - logger.Error("some error", zap.Error(errs.Wrap(err, "crash"))) - out.requireContains(t, []string{"error"}) + logger.With(zap.Error(errors.New("test error"))).Error("boom") + out.requireContains(t, []string{"error", "message"}) + assert.Equal(t, "boom", out.m["message"]) + outErr, ok := out.m["error"].(map[string]interface{}) + require.True(t, ok, out.m["error"]) + assert.Equal(t, map[string]interface{}{"message": "test error"}, outErr) // Adding logger wide fields and a logger name out.reset() logger = logger.With(zap.String("foo", "bar")) - logger = logger.With(zap.Error(errors.New("wrapCore Error"))) logger = logger.Named("mylogger") logger.Debug("debug message") - out.requireContains(t, []string{"log.logger", "foo", "error"}) + out.requireContains(t, []string{"log.logger", "foo"}) // Use loosely typed logger out.reset() @@ -104,20 +104,6 @@ func TestECSZapLogger_With(t *testing.T) { "@timestamp", "log.level", "log.origin", "foo", "count"}) out.reset() - }) } - // Wrapped logger - out.reset() - cfg := ECSCompatibleEncoderConfig(zap.NewProductionEncoderConfig()) - encoder := zapcore.NewJSONEncoder(cfg) - core := zapcore.NewCore(encoder, &out, zap.DebugLevel) - logger := zap.New(WrapCore(core), zap.AddCaller()) - defer logger.Sync() - logger.With(zap.Error(errors.New("wrapCore"))).Error("boom") - out.requireContains(t, []string{"error", "message"}) - assert.Equal(t, "boom", out.m["message"]) - outErr, ok := out.m["error"].(map[string]interface{}) - require.True(t, ok, out.m["error"]) - assert.Equal(t, map[string]interface{}{"message": "wrapCore"}, outErr) } From d2839eb4690266d4b96d9ac3f3390626d5d91078 Mon Sep 17 00:00:00 2001 From: Silvia Mitter Date: Tue, 12 Jan 2021 20:46:03 +0100 Subject: [PATCH 2/2] Update README.md Co-authored-by: Andrew Wilkins --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7e833cd..a43ef23 100644 --- a/README.md +++ b/README.md @@ -143,7 +143,7 @@ logger := zap.New(ecszap.WrapCore(core), zap.AddCaller()) ```go config := zap.NewProductionConfig() config.EncoderConfig = ecszap.ECSCompatibleEncoderConfig(config.EncoderConfig) -logger, err := config.Build(ecszap.WrapCoreOption()) +logger, err := config.Build(ecszap.WrapCoreOption(), zap.AddCaller()) ```