diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl index 5070859f7c48..6bc993eec7c8 100644 --- a/lib/kernel/src/logger.erl +++ b/lib/kernel/src/logger.erl @@ -1084,23 +1084,24 @@ get_primary_config() -> Config :: logger_handler:config(). get_handler_config(HandlerId) -> case logger_config:get(?LOGGER_TABLE,HandlerId) of - {ok,#{module:=Module}=Config} -> - {ok,try Module:filter_config(Config) - catch _:_ -> Config - end}; + {ok, Config} -> + {ok, filter_config(Config)}; Error -> Error end. +filter_config(#{module:=Module}=Config) -> + try Module:filter_config(Config) + catch _:_ -> Config + end. + -doc "Look up the current configuration for all handlers.". -doc(#{group => <<"Configuration API functions">>,since => <<"OTP 21.0">>}). -spec get_handler_config() -> [Config] when Config :: logger_handler:config(). get_handler_config() -> - [begin - {ok,Config} = get_handler_config(HandlerId), - Config - end || HandlerId <- get_handler_ids()]. + Configs = logger_config:get(?LOGGER_TABLE), + [filter_config(Config) || Config <- Configs]. -doc "Look up the identities for all installed handlers.". -doc(#{group => <<"Configuration API functions">>,since => <<"OTP 21.0">>}). diff --git a/lib/kernel/src/logger_config.erl b/lib/kernel/src/logger_config.erl index cfe6d45b8327..621e210baa77 100644 --- a/lib/kernel/src/logger_config.erl +++ b/lib/kernel/src/logger_config.erl @@ -25,7 +25,7 @@ -export([new/1,delete/2, exist/2, allow/1,allow/2, - get/2, get/3, + get/1, get/2, get/3, create/3, set/3, set_module_level/2,unset_module_level/1, get_module_level/0, @@ -90,6 +90,10 @@ exist(Tid,What) -> get_primary_level() -> persistent_term:get({?MODULE,?PRIMARY_KEY},?NOTICE). +get(Tid) -> + Configs = ets:match(Tid, {{?HANDLER_KEY, '_'}, '$1'}), + lists:flatten(Configs). + get(Tid,What) -> case ets:lookup(Tid,table_key(What)) of [{_,Config}] -> diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl index d381309a7f28..d0b33cec2268 100644 --- a/lib/kernel/test/logger_SUITE.erl +++ b/lib/kernel/test/logger_SUITE.erl @@ -84,6 +84,7 @@ all() -> multiple_handlers, add_remove_filter, change_config, + get_config_error, set_formatter, log_no_levels, log_all_levels_api, @@ -298,6 +299,30 @@ change_config(cleanup,Config) -> logger:set_primary_config(PC), ok. +get_config_error(_Config) -> + Self = self(), + register(callback_receiver,Self), + HandlerCnt = 2000, + HandlerIds = [list_to_atom("handler-"++integer_to_list(Idx)) || Idx <- lists:seq(1,HandlerCnt)], + [ok = logger:add_handler(HId,?MODULE,#{}) || HId <- HandlerIds], + RemoveFun = fun () -> + Self ! started, + [ok = logger:remove_handler(HId) || HId <- HandlerIds], + Self ! removed + end, + Remove = spawn(RemoveFun), + receive + started -> ok + end, + ?assertNotException(_, _, logger:get_handler_config()), + %% Just to make sure RemoveFun did not die before. + %% If line below fails please raise HandlerCnt by factor of 2 + ?assert(erlang:is_process_alive(Remove)), + receive + removed -> ok + end, + ok. + set_formatter(_Config) -> {error,{not_found,h1}}=logger:set_handler_config(h1,formatter,{?MODULE,[]}), ok = logger:add_handler(h1,?MODULE,#{level=>notice,filter_default=>log}),