Skip to content

Commit 2af7bcc

Browse files
authored
Merge pull request #10308 from MarkoMin/fix/logger/get_handler_config
feat: "atomic" get_handler_configs OTP-19837
2 parents 0906e42 + 27042fa commit 2af7bcc

File tree

3 files changed

+39
-9
lines changed

3 files changed

+39
-9
lines changed

lib/kernel/src/logger.erl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,23 +1084,24 @@ get_primary_config() ->
10841084
Config :: logger_handler:config().
10851085
get_handler_config(HandlerId) ->
10861086
case logger_config:get(?LOGGER_TABLE,HandlerId) of
1087-
{ok,#{module:=Module}=Config} ->
1088-
{ok,try Module:filter_config(Config)
1089-
catch _:_ -> Config
1090-
end};
1087+
{ok, Config} ->
1088+
{ok, filter_config(Config)};
10911089
Error ->
10921090
Error
10931091
end.
10941092

1093+
filter_config(#{module:=Module}=Config) ->
1094+
try Module:filter_config(Config)
1095+
catch _:_ -> Config
1096+
end.
1097+
10951098
-doc "Look up the current configuration for all handlers.".
10961099
-doc(#{group => <<"Configuration API functions">>,since => <<"OTP 21.0">>}).
10971100
-spec get_handler_config() -> [Config] when
10981101
Config :: logger_handler:config().
10991102
get_handler_config() ->
1100-
[begin
1101-
{ok,Config} = get_handler_config(HandlerId),
1102-
Config
1103-
end || HandlerId <- get_handler_ids()].
1103+
Configs = logger_config:get(?LOGGER_TABLE),
1104+
[filter_config(Config) || Config <- Configs].
11041105

11051106
-doc "Look up the identities for all installed handlers.".
11061107
-doc(#{group => <<"Configuration API functions">>,since => <<"OTP 21.0">>}).

lib/kernel/src/logger_config.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
-export([new/1,delete/2,
2626
exist/2,
2727
allow/1,allow/2,
28-
get/2, get/3,
28+
get/1, get/2, get/3,
2929
create/3, set/3,
3030
set_module_level/2,unset_module_level/1,
3131
get_module_level/0,
@@ -90,6 +90,10 @@ exist(Tid,What) ->
9090
get_primary_level() ->
9191
persistent_term:get({?MODULE,?PRIMARY_KEY},?NOTICE).
9292

93+
get(Tid) ->
94+
Configs = ets:match(Tid, {{?HANDLER_KEY, '_'}, '$1'}),
95+
lists:flatten(Configs).
96+
9397
get(Tid,What) ->
9498
case ets:lookup(Tid,table_key(What)) of
9599
[{_,Config}] ->

lib/kernel/test/logger_SUITE.erl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ all() ->
8484
multiple_handlers,
8585
add_remove_filter,
8686
change_config,
87+
get_config_error,
8788
set_formatter,
8889
log_no_levels,
8990
log_all_levels_api,
@@ -298,6 +299,30 @@ change_config(cleanup,Config) ->
298299
logger:set_primary_config(PC),
299300
ok.
300301

302+
get_config_error(_Config) ->
303+
Self = self(),
304+
register(callback_receiver,Self),
305+
HandlerCnt = 2000,
306+
HandlerIds = [list_to_atom("handler-"++integer_to_list(Idx)) || Idx <- lists:seq(1,HandlerCnt)],
307+
[ok = logger:add_handler(HId,?MODULE,#{}) || HId <- HandlerIds],
308+
RemoveFun = fun () ->
309+
Self ! started,
310+
[ok = logger:remove_handler(HId) || HId <- HandlerIds],
311+
Self ! removed
312+
end,
313+
Remove = spawn(RemoveFun),
314+
receive
315+
started -> ok
316+
end,
317+
?assertNotException(_, _, logger:get_handler_config()),
318+
%% Just to make sure RemoveFun did not die before.
319+
%% If line below fails please raise HandlerCnt by factor of 2
320+
?assert(erlang:is_process_alive(Remove)),
321+
receive
322+
removed -> ok
323+
end,
324+
ok.
325+
301326
set_formatter(_Config) ->
302327
{error,{not_found,h1}}=logger:set_handler_config(h1,formatter,{?MODULE,[]}),
303328
ok = logger:add_handler(h1,?MODULE,#{level=>notice,filter_default=>log}),

0 commit comments

Comments
 (0)