From 8d5e39eb83032fbab6b775fce9d53377e44f20b9 Mon Sep 17 00:00:00 2001 From: r-hang <42982339+r-hang@users.noreply.github.com> Date: Tue, 23 Mar 2021 09:42:34 -0700 Subject: [PATCH] Add FilterFieldKey to zaptest/observer (#928) Adds functionality to filter zap.Field by key. This makes testing for field existence regardless of value more convenient. resolves https://github.com/uber-go/zap/issues/816 --- zaptest/observer/observer.go | 12 ++++++++++++ zaptest/observer/observer_test.go | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/zaptest/observer/observer.go b/zaptest/observer/observer.go index 78f5be45d..6ae58f5d6 100644 --- a/zaptest/observer/observer.go +++ b/zaptest/observer/observer.go @@ -104,6 +104,18 @@ func (o *ObservedLogs) FilterField(field zapcore.Field) *ObservedLogs { }) } +// FilterFieldKey filters entries to those that have the specified key. +func (o *ObservedLogs) FilterFieldKey(key string) *ObservedLogs { + return o.filter(func(e LoggedEntry) bool { + for _, ctxField := range e.Context { + if ctxField.Key == key { + return true + } + } + return false + }) +} + func (o *ObservedLogs) filter(match func(LoggedEntry) bool) *ObservedLogs { o.mu.RLock() defer o.mu.RUnlock() diff --git a/zaptest/observer/observer_test.go b/zaptest/observer/observer_test.go index e1a0da78c..4e8139493 100644 --- a/zaptest/observer/observer_test.go +++ b/zaptest/observer/observer_test.go @@ -149,6 +149,14 @@ func TestFilters(t *testing.T) { Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "any slice"}, Context: []zapcore.Field{zap.Any("slice", []string{"a"})}, }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "msg 2"}, + Context: []zapcore.Field{zap.Int("b", 2), zap.Namespace("filterMe")}, + }, + { + Entry: zapcore.Entry{Level: zap.InfoLevel, Message: "any slice"}, + Context: []zapcore.Field{zap.Any("filterMe", []string{"b"})}, + }, } logger, sink := New(zap.InfoLevel) @@ -206,6 +214,11 @@ func TestFilters(t *testing.T) { filtered: sink.FilterField(zap.Any("slice", []string{"a"})), want: logs[6:7], }, + { + msg: "filter field key", + filtered: sink.FilterFieldKey("filterMe"), + want: logs[7:9], + }, } for _, tt := range tests {