From 4e9f0492fd46d1ba6d919883cbdd5caaff8a949b Mon Sep 17 00:00:00 2001
From: Siri Hansen <siri@erlang.org>
Date: Wed, 16 May 2018 14:58:03 +0200
Subject: Add Action=differs to logger_filters:domain/2

---
 lib/kernel/doc/src/logger_filters.xml    |  4 ++++
 lib/kernel/src/logger_filters.erl        |  6 +++++-
 lib/kernel/test/logger_filters_SUITE.erl | 25 +++++++++++++++++++------
 3 files changed, 28 insertions(+), 7 deletions(-)

(limited to 'lib/kernel')

diff --git a/lib/kernel/doc/src/logger_filters.xml b/lib/kernel/doc/src/logger_filters.xml
index c34ec7d14c..1bbae8be21 100644
--- a/lib/kernel/doc/src/logger_filters.xml
+++ b/lib/kernel/doc/src/logger_filters.xml
@@ -78,6 +78,10 @@
 	    <tag><c><anno>Compare</anno> = equals</c></tag>
 	    <item><p>The filter matches if <c>Domain</c> is equal
 	      to <c>MatchDomain</c>.</p></item>
+	    <tag><c><anno>Compare</anno> = differs</c></tag>
+	    <item><p>The filter matches if <c>Domain</c> differs
+	      from <c>MatchDomain</c>, or if there is no domain field
+	      in metadata.</p></item>
 	    <tag><c><anno>Compare</anno> = no_domain</c></tag>
 	    <item><p>The filter matches if there is no domain field in
 	      metadata. In this case <c><anno>MatchDomain</anno></c> shall
diff --git a/lib/kernel/src/logger_filters.erl b/lib/kernel/src/logger_filters.erl
index 85928f0fd6..592ff28cc2 100644
--- a/lib/kernel/src/logger_filters.erl
+++ b/lib/kernel/src/logger_filters.erl
@@ -38,6 +38,7 @@ domain(#{meta:=Meta}=Log,{Action,Compare,MatchDomain})
        (Compare==prefix_of orelse
         Compare==starts_with orelse
         Compare==equals orelse
+        Compare==differs orelse
         Compare==no_domain) andalso
        is_list(MatchDomain) ->
     filter_domain(Compare,Meta,MatchDomain,on_match(Action,Log));
@@ -87,9 +88,12 @@ filter_domain(starts_with,#{domain:=Domain},MatchDomain,OnMatch) ->
     is_prefix(MatchDomain,Domain,OnMatch);
 filter_domain(equals,#{domain:=Domain},Domain,OnMatch) ->
     OnMatch;
+filter_domain(differs,#{domain:=Domain},MatchDomain,OnMatch)
+  when Domain=/=MatchDomain ->
+    OnMatch;
 filter_domain(Action,Meta,_,OnMatch) ->
     case maps:is_key(domain,Meta) of
-        false when Action==no_domain -> OnMatch;
+        false when Action==no_domain; Action==differs -> OnMatch;
         _ -> ignore
     end.
 
diff --git a/lib/kernel/test/logger_filters_SUITE.erl b/lib/kernel/test/logger_filters_SUITE.erl
index 21f14bbc02..c4b31370ff 100644
--- a/lib/kernel/test/logger_filters_SUITE.erl
+++ b/lib/kernel/test/logger_filters_SUITE.erl
@@ -81,6 +81,8 @@ domain(_Config) ->
     stop = logger_filters:domain(?dlog([]),{stop,starts_with,[]}),
     L3 = logger_filters:domain(L3=?dlog([]),{log,equals,[]}),
     stop = logger_filters:domain(?dlog([]),{stop,equals,[]}),
+    ignore = logger_filters:domain(?dlog([]),{log,differs,[]}),
+    ignore = logger_filters:domain(?dlog([]),{stop,differs,[]}),
     ignore = logger_filters:domain(?dlog([]),{log,no_domain,[]}),
     ignore = logger_filters:domain(?dlog([]),{stop,no_domain,[]}),
 
@@ -90,15 +92,19 @@ domain(_Config) ->
     ignore = logger_filters:domain(?dlog([a]),{stop,starts_with,[a,b]}),
     ignore = logger_filters:domain(?dlog([a]),{log,equals,[a,b]}),
     ignore = logger_filters:domain(?dlog([a]),{stop,equals,[a,b]}),
+    L5 = logger_filters:domain(L5=?dlog([a]),{log,differs,[a,b]}),
+    stop = logger_filters:domain(?dlog([a]),{stop,differs,[a,b]}),
     ignore = logger_filters:domain(?dlog([a]),{log,no_domain,[a,b]}),
     ignore = logger_filters:domain(?dlog([a]),{stop,no_domain,[a,b]}),
 
     ignore = logger_filters:domain(?dlog([a,b]),{log,prefix_of,[a]}),
     ignore = logger_filters:domain(?dlog([a,b]),{stop,prefix_of,[a]}),
-    L5 = logger_filters:domain(L5=?dlog([a,b]),{log,starts_with,[a]}),
+    L6 = logger_filters:domain(L6=?dlog([a,b]),{log,starts_with,[a]}),
     stop = logger_filters:domain(?dlog([a,b]),{stop,starts_with,[a]}),
     ignore = logger_filters:domain(?dlog([a,b]),{log,equals,[a]}),
     ignore = logger_filters:domain(?dlog([a,b]),{stop,equals,[a]}),
+    L7 = logger_filters:domain(L7=?dlog([a,b]),{log,differs,[a]}),
+    stop = logger_filters:domain(?dlog([a,b]),{stop,differs,[a]}),
     ignore = logger_filters:domain(?dlog([a,b]),{log,no_domain,[a]}),
     ignore = logger_filters:domain(?dlog([a,b]),{stop,no_domain,[a]}),
 
@@ -108,26 +114,33 @@ domain(_Config) ->
     ignore = logger_filters:domain(?ndlog,{stop,starts_with,[a]}),
     ignore = logger_filters:domain(?ndlog,{log,equals,[a]}),
     ignore = logger_filters:domain(?ndlog,{stop,equals,[a]}),
-    L6 = logger_filters:domain(L6=?ndlog,{log,no_domain,[a]}),
+    L8 = logger_filters:domain(L8=?ndlog,{log,differs,[a]}),
+    stop = logger_filters:domain(?ndlog,{stop,differs,[a]}),
+    L9 = logger_filters:domain(L9=?ndlog,{log,no_domain,[a]}),
     stop = logger_filters:domain(?ndlog,{stop,no_domain,[a]}),
 
-    L7 = logger_filters:domain(L7=?dlog([a,b,c,d]),{log,prefix_of,[a,b,c,d]}),
+    L10 = logger_filters:domain(L10=?dlog([a,b,c,d]),{log,prefix_of,[a,b,c,d]}),
     stop = logger_filters:domain(?dlog([a,b,c,d]),{stop,prefix_of,[a,b,c,d]}),
-    L8 = logger_filters:domain(L8=?dlog([a,b,c,d]),{log,starts_with,[a,b,c,d]}),
+    L11 = logger_filters:domain(L11=?dlog([a,b,c,d]),{log,starts_with,[a,b,c,d]}),
     stop = logger_filters:domain(?dlog([a,b,c,d]),{stop,starts_with,[a,b,c,d]}),
-    L9 = logger_filters:domain(L9=?dlog([a,b,c,d]),{log,equals,[a,b,c,d]}),
+    L12 = logger_filters:domain(L12=?dlog([a,b,c,d]),{log,equals,[a,b,c,d]}),
     stop = logger_filters:domain(?dlog([a,b,c,d]),{stop,equals,[a,b,c,d]}),
+    ignore = logger_filters:domain(?dlog([a,b,c,d]),{log,differs,[a,b,c,d]}),
+    ignore = logger_filters:domain(?dlog([a,b,c,d]),{stop,differs,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog([a,b,c,d]),{log,no_domain,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog([a,b,c,d]),{stop,no_domain,[a,b,c,d]}),
 
     %% A domain field in meta which is not a list is allowed by the
-    %% filter, but it will never match.
+    %% filter, but since MatchDomain is always a list of atoms, only
+    %% Action=differs can ever match.
     ignore = logger_filters:domain(?dlog(dummy),{log,prefix_of,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{stop,prefix_of,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{log,starts_with,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{stop,starts_with,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{log,equals,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{stop,equals,[a,b,c,d]}),
+    L13 = logger_filters:domain(L13=?dlog(dummy),{log,differs,[a,b,c,d]}),
+    stop = logger_filters:domain(?dlog(dummy),{stop,differs,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{log,no_domain,[a,b,c,d]}),
     ignore = logger_filters:domain(?dlog(dummy),{stop,no_domain,[a,b,c,d]}),
 
-- 
cgit v1.2.3