aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/src
diff options
context:
space:
mode:
authorSiri Hansen <[email protected]>2018-06-08 14:23:13 +0200
committerSiri Hansen <[email protected]>2018-06-08 14:40:13 +0200
commit0a235e6b1f008ade99b18438e671b93ff82cc268 (patch)
tree68bb3cd638028520f574849488151712a1025e3c /lib/kernel/src
parent577d903af9eb5b028611a957b8f07b06fbbd741e (diff)
downloadotp-0a235e6b1f008ade99b18438e671b93ff82cc268.tar.gz
otp-0a235e6b1f008ade99b18438e671b93ff82cc268.tar.bz2
otp-0a235e6b1f008ade99b18438e671b93ff82cc268.zip
[logger] Update interface for setting/unsetting module level
* Level can now be set/unset for multiple modules in one call. * Added functions get_module_level/0 and get_module_level/1.
Diffstat (limited to 'lib/kernel/src')
-rw-r--r--lib/kernel/src/logger.erl44
-rw-r--r--lib/kernel/src/logger_config.erl26
-rw-r--r--lib/kernel/src/logger_server.erl46
3 files changed, 82 insertions, 34 deletions
diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl
index 907e2035f1..395ec448ff 100644
--- a/lib/kernel/src/logger.erl
+++ b/lib/kernel/src/logger.erl
@@ -37,7 +37,9 @@
-export([add_handler/3, remove_handler/1,
add_logger_filter/2, add_handler_filter/3,
remove_logger_filter/1, remove_handler_filter/2,
- set_module_level/2, unset_module_level/1,
+ set_module_level/2,
+ unset_module_level/1, unset_module_level/0,
+ get_module_level/0, get_module_level/1,
set_logger_config/1, set_logger_config/2,
set_handler_config/2, set_handler_config/3,
update_logger_config/1, update_handler_config/2,
@@ -408,16 +410,40 @@ update_formatter_config(HandlerId,FormatterConfig) ->
update_formatter_config(HandlerId,Key,Value) ->
logger_server:update_formatter_config(HandlerId,#{Key=>Value}).
--spec set_module_level(Module,Level) -> ok | {error,term()} when
+-spec set_module_level(Modules,Level) -> ok | {error,term()} when
+ Modules :: [module()] | module(),
+ Level :: level().
+set_module_level(Module,Level) when is_atom(Module) ->
+ set_module_level([Module],Level);
+set_module_level(Modules,Level) ->
+ logger_server:set_module_level(Modules,Level).
+
+-spec unset_module_level(Modules) -> ok when
+ Modules :: [module()] | module().
+unset_module_level(Module) when is_atom(Module) ->
+ unset_module_level([Module]);
+unset_module_level(Modules) ->
+ logger_server:unset_module_level(Modules).
+
+-spec unset_module_level() -> ok.
+unset_module_level() ->
+ logger_server:unset_module_level().
+
+-spec get_module_level(Modules) -> [{Module,Level}] when
+ Modules :: [Module] | Module,
Module :: module(),
Level :: level().
-set_module_level(Module,Level) ->
- logger_server:set_module_level(Module,Level).
+get_module_level(Module) when is_atom(Module) ->
+ get_module_level([Module]);
+get_module_level(Modules) when is_list(Modules) ->
+ [{M,L} || {M,L} <- get_module_level(),
+ lists:member(M,Modules)].
--spec unset_module_level(Module) -> ok | {error,term()} when
- Module :: module().
-unset_module_level(Module) ->
- logger_server:unset_module_level(Module).
+-spec get_module_level() -> [{Module,Level}] when
+ Module :: module(),
+ Level :: level().
+get_module_level() ->
+ logger_config:get_module_level(?LOGGER_TABLE).
%%%-----------------------------------------------------------------
%%% Misc
@@ -496,7 +522,7 @@ i(_Action = string) ->
print_module_levels(Modules)
];
i(_Action = term) ->
- {Logger, Handlers, Modules} = logger_config:get(tid()),
+ {Logger, Handlers, Modules} = logger_config:get(?LOGGER_TABLE),
#{logger=>maps:remove(handlers,Logger),
handlers=>lists:keysort(1,Handlers),
module_levels=>lists:keysort(1,Modules)}.
diff --git a/lib/kernel/src/logger_config.erl b/lib/kernel/src/logger_config.erl
index 1d35c2e068..8d05648109 100644
--- a/lib/kernel/src/logger_config.erl
+++ b/lib/kernel/src/logger_config.erl
@@ -25,7 +25,7 @@
get/2, get/3, get/1,
create/3, create/4, set/3,
set_module_level/3,unset_module_level/2,
- cache_module_level/2,
+ get_module_level/1,cache_module_level/2,
level_to_int/1]).
-include("logger_internal.hrl").
@@ -105,14 +105,25 @@ set(Tid,What,Config) ->
ets:update_element(Tid,table_key(What),[{2,LevelInt},{3,Config}]),
ok.
-set_module_level(Tid,Module,Level) ->
- ets:insert(Tid,{Module,level_to_int(Level)}),
+set_module_level(Tid,Modules,Level) ->
+ LevelInt = level_to_int(Level),
+ [ets:insert(Tid,{Module,LevelInt}) || Module <- Modules],
ok.
-unset_module_level(Tid,Module) ->
- ets:delete(Tid,Module), % should possibley overwrite instead of delete?
+%% should possibly overwrite instead of delete?
+unset_module_level(Tid,all) ->
+ MS = [{{'$1','$2'},[{is_atom,'$1'},{is_integer,'$2'}],[true]}],
+ _ = ets:select_delete(Tid,MS),
+ ok;
+unset_module_level(Tid,Modules) ->
+ [ets:delete(Tid,Module) || Module <- Modules],
ok.
+get_module_level(Tid) ->
+ MS = [{{'$1','$2'},[{is_atom,'$1'},{is_integer,'$2'}],[{{'$1','$2'}}]}],
+ Modules = ets:select(Tid,MS),
+ lists:sort([{M,int_to_level(L)} || {M,L} <- Modules]).
+
cache_module_level(Tid,Module) ->
GlobalLevelInt = ets:lookup_element(Tid,?LOGGER_KEY,2),
ets:insert_new(Tid,{Module,{GlobalLevelInt,cached}}),
@@ -122,9 +133,8 @@ get(Tid) ->
{ok,Logger} = get(Tid,logger),
HMS = [{{table_key('$1'),'_','$2','$3'},[],[{{'$1','$3','$2'}}]}],
Handlers = ets:select(Tid,HMS),
- MMS = [{{'$1','$2'},[{is_atom,'$1'},{is_integer,'$2'}],[{{'$1','$2'}}]}],
- Modules = ets:select(Tid,MMS),
- {Logger,Handlers,[{M,int_to_level(L)} || {M,L} <- Modules]}.
+ Modules = get_module_level(Tid),
+ {Logger,Handlers,Modules}.
level_to_int(emergency) -> ?EMERGENCY;
level_to_int(alert) -> ?ALERT;
diff --git a/lib/kernel/src/logger_server.erl b/lib/kernel/src/logger_server.erl
index e066837b63..164e193fa0 100644
--- a/lib/kernel/src/logger_server.erl
+++ b/lib/kernel/src/logger_server.erl
@@ -25,8 +25,8 @@
-export([start_link/0,
add_handler/3, remove_handler/1,
add_filter/2, remove_filter/2,
- set_module_level/2, unset_module_level/1,
- cache_module_level/1,
+ set_module_level/2, unset_module_level/0,
+ unset_module_level/1, cache_module_level/1,
set_config/2, set_config/3, update_config/2,
update_formatter_config/2]).
@@ -75,23 +75,35 @@ add_filter(Owner,Filter) ->
remove_filter(Owner,FilterId) ->
call({remove_filter,Owner,FilterId}).
-set_module_level(Module,Level) when is_atom(Module) ->
- case sanity_check(logger,level,Level) of
- ok -> call({set_module_level,Module,Level});
- Error -> Error
+set_module_level(Modules,Level) when is_list(Modules) ->
+ case lists:all(fun(M) -> is_atom(M) end,Modules) of
+ true ->
+ case sanity_check(logger,level,Level) of
+ ok -> call({set_module_level,Modules,Level});
+ Error -> Error
+ end;
+ false ->
+ {error,{not_a_list_of_modles,Modules}}
end;
-set_module_level(Module,_) ->
- {error,{not_a_module,Module}}.
+set_module_level(Modules,_) ->
+ {error,{not_a_list_of_modules,Modules}}.
-unset_module_level(Module) when is_atom(Module) ->
- call({unset_module_level,Module});
-unset_module_level(Module) ->
- {error,{not_a_module,Module}}.
+unset_module_level() ->
+ call({unset_module_level,all}).
+
+unset_module_level(Modules) when is_list(Modules) ->
+ case lists:all(fun(M) -> is_atom(M) end,Modules) of
+ true ->
+ call({unset_module_level,Modules});
+ false ->
+ {error,{not_a_list_of_modles,Modules}}
+ end;
+unset_module_level(Modules) ->
+ {error,{not_a_list_of_modules,Modules}}.
cache_module_level(Module) ->
gen_server:cast(?SERVER,{cache_module_level,Module}).
-
set_config(Owner,Key,Value) ->
update_config(Owner,#{Key=>Value}).
@@ -239,11 +251,11 @@ handle_call({update_formatter_config,HandlerId,NewFConfig},_From,
{error,{not_found,HandlerId}}
end,
{reply,Reply,State};
-handle_call({set_module_level,Module,Level}, _From, #state{tid=Tid}=State) ->
- Reply = logger_config:set_module_level(Tid,Module,Level),
+handle_call({set_module_level,Modules,Level}, _From, #state{tid=Tid}=State) ->
+ Reply = logger_config:set_module_level(Tid,Modules,Level),
{reply,Reply,State};
-handle_call({unset_module_level,Module}, _From, #state{tid=Tid}=State) ->
- Reply = logger_config:unset_module_level(Tid,Module),
+handle_call({unset_module_level,Modules}, _From, #state{tid=Tid}=State) ->
+ Reply = logger_config:unset_module_level(Tid,Modules),
{reply,Reply,State}.
handle_cast({async_req_reply,_Ref,_Reply} = Reply,State) ->