diff --git a/zap/channels.go b/zap/channels.go
index c67d275541c28739dd45b04d8c643534e39dba16..33451c3afbd653815f55db84dcaea925cd1074e8 100644
--- a/zap/channels.go
+++ b/zap/channels.go
@@ -6,7 +6,9 @@ import (
 	"go.uber.org/zap/zapcore"
 )
 
-const channelKey = "channel"
+const (
+	channelKey = "channel"
+)
 
 func HasChannel(channel string) FilterFunc {
 	return func(entry zapcore.Entry, fields []zapcore.Field) bool {
@@ -27,17 +29,19 @@ func HasChannel(channel string) FilterFunc {
 // NewDefaultChannelCore аналогичен NewChannelCore, но также устанавливает переданный канал в качестве канала по умолчанию.
 // Это означает, что если поле Channel в записи не указано, запись все равно будет передана в zapcore.Core.
 func NewDefaultChannelCore(core zapcore.Core, channel string) zapcore.Core {
-	return RegisterFilters(
-		core,
-		Or(
-			HasChannel(channel),
-			Not(ContainsKey(channelKey)),
-		),
-	)
+	return NewChannelCore(core, channel, true)
 }
 
 // NewChannelCore добавляет к переданному Core фильтрацию записей по каналам.
-// Это означает, что если запись содержит поле Channel и значение соответствует переданному каналу, то запись будет передана в zapcore.Core.
-func NewChannelCore(core zapcore.Core, channel string) zapcore.Core {
-	return RegisterFilters(core, HasChannel(channel))
+// Это означает, что если запись содержит поле Channel и значение соответствует
+// переданному каналу, то запись будет передана в zapcore.Core.
+func NewChannelCore(core zapcore.Core, channel string, isDefault ...bool) zapcore.Core {
+	filterFn := HasChannel(channel)
+	if len(isDefault) > 0 && isDefault[0] {
+		filterFn = Or(
+			HasChannel(channel),
+			Not(ContainsKey(channelKey)),
+		)
+	}
+	return RegisterFilters(core, filterFn)
 }
diff --git a/zap/field.go b/zap/field.go
index b439f51b05736b77ff0a991e9b828a2116cfa0e3..09385b06672a5381036a0cb182697b823b092478 100644
--- a/zap/field.go
+++ b/zap/field.go
@@ -11,9 +11,6 @@ import (
 )
 
 func Channel(channels ...string) zap.Field {
-	if len(channels) == 0 {
-		return zap.Skip()
-	}
 	return zap.String(channelKey, strings.Join(channels, ","))
 }
 
diff --git a/zap/filter_core_test.go b/zap/filter_core_test.go
index cb38f41cd2f0c5bab0aabea75112d9f1a57fd109..6684be5fed08d382d41452a4a196a7fef9e45de1 100644
--- a/zap/filter_core_test.go
+++ b/zap/filter_core_test.go
@@ -25,9 +25,9 @@ func TestFilterCore_Write(t *testing.T) {
 	require.Equal(t, 2, logs.Len())
 }
 
-func TestNotHasField(t *testing.T) {
+func TestNotContainsField(t *testing.T) {
 	core, logs := observer.New(zapcore.InfoLevel)
-	core = RegisterFilters(core, NotHasField(zap.Int("b", 2)))
+	core = RegisterFilters(core, Not(ContainsField(zap.Int("b", 2))))
 
 	err := core.Write(zapcore.Entry{Message: "msg"}, []zapcore.Field{
 		zap.Int("a", 1),