diff options
| -rw-r--r-- | lib/kernel/doc/src/logger.xml | 23 | ||||
| -rw-r--r-- | lib/kernel/doc/src/logger_chapter.xml | 26 | ||||
| -rw-r--r-- | lib/kernel/src/error_logger.erl | 10 | ||||
| -rw-r--r-- | lib/kernel/src/logger.erl | 3 | ||||
| -rw-r--r-- | lib/kernel/src/logger_disk_log_h.erl | 25 | ||||
| -rw-r--r-- | lib/kernel/src/logger_server.erl | 13 | ||||
| -rw-r--r-- | lib/kernel/src/logger_simple.erl | 6 | ||||
| -rw-r--r-- | lib/kernel/src/logger_std_h.erl | 25 | ||||
| -rw-r--r-- | lib/kernel/test/logger_SUITE.erl | 12 | 
9 files changed, 71 insertions, 72 deletions
diff --git a/lib/kernel/doc/src/logger.xml b/lib/kernel/doc/src/logger.xml index 6e50473fa8..d6576db6f3 100644 --- a/lib/kernel/doc/src/logger.xml +++ b/lib/kernel/doc/src/logger.xml @@ -881,11 +881,9 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).    <funcs>      <func> -      <name>HModule:adding_handler(HandlerId,Config1) -> {ok,Config2} | {error,Reason}</name> +      <name>HModule:adding_handler(Config1) -> {ok,Config2} | {error,Reason}</name>        <fsummary>An instance of this handler is about to be added.</fsummary>        <type> -	<v>HandlerId = -	  <seealso marker="#type-handler_id">handler_id()</seealso></v>  	<v>Config1 = Config2 =  	  <seealso marker="#type-config">config()</seealso></v>  	<v>Reason = term()</v> @@ -895,6 +893,8 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).  	<p>The function is called when an new handler is about to be  	  added, and the purpose is to verify the configuration and  	  initiate all resources needed by the handler.</p> +	<p>The handler identity is associated with the <c>id</c> key +	  in <c>Config1</c>.</p>  	<p>If everything succeeds, the callback function can add  	  possible default values or internal state values to the  	  configuration, and return the adjusted map @@ -905,11 +905,9 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).      </func>      <func> -      <name>HModule:changing_config(HandlerId,Config1,Config2) -> {ok,Config3} | {error,Reason}</name> +      <name>HModule:changing_config(Config1,Config2) -> {ok,Config3} | {error,Reason}</name>        <fsummary>The configuration for this handler is about to change.</fsummary>        <type> -	<v>HandlerId = -	  <seealso marker="#type-handler_id">handler_id()</seealso></v>  	<v>Config1 = Config2 = Config3 =  	  <seealso marker="#type-config">config()</seealso></v>  	<v>Reason = term()</v> @@ -921,6 +919,8 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).  	  the new configuration.</p>  	<p><c>Config1</c> is the existing configuration  	  and <c>Config2</c> is the new configuration.</p> +	<p>The handler identity is associated with the <c>id</c> key +	  in <c>Config1</c>.</p>  	<p>If everything succeeds, the callback function must return a  	  possibly adjusted configuration in <c>{ok,Config3}</c>.</p>  	<p>If the configuration is faulty, the callback function must @@ -942,6 +942,8 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).  	<p>The function is called when all global filters and all  	  handler filters for the handler in question have passed for  	  the given log event.</p> +	<p>The handler identity is associated with the <c>id</c> key +	  in <c>Config</c>.</p>  	<p>The handler must log the event.</p>  	<p>The return value from this function is ignored by  	  Logger.</p> @@ -949,11 +951,9 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).      </func>      <func> -      <name>HModule:removing_handler(HandlerId,Config) -> ok</name> +      <name>HModule:removing_handler(Config) -> ok</name>        <fsummary>The given handler is about to be removed.</fsummary>        <type> -	<v>HandlerId = -	  <seealso marker="#type-handler_id">handler_id()</seealso></v>  	<v>Config =  	  <seealso marker="#type-config">config()</seealso></v>        </type> @@ -961,7 +961,10 @@ logger:set_process_metadata(maps:merge(logger:get_process_metadata(),Meta)).  	<p>This callback function is optional.</p>  	<p>The function is called when a handler is about to be  	  removed, and the purpose is to release all resources used by -	  the handler. The return value is ignored by Logger.</p> +	  the handler.</p> +	<p>The handler identity is associated with the <c>id</c> key +	  in <c>Config</c>.</p> +	<p>The return value is ignored by Logger.</p>        </desc>      </func> diff --git a/lib/kernel/doc/src/logger_chapter.xml b/lib/kernel/doc/src/logger_chapter.xml index 1195808160..78c595d521 100644 --- a/lib/kernel/doc/src/logger_chapter.xml +++ b/lib/kernel/doc/src/logger_chapter.xml @@ -268,7 +268,7 @@      <p>In addition to the mandatory callback function <c>log/2</c>, a        handler module can export the optional callback -      functions <c>adding_handler/2</c>, <c>changing_config/3</c> +      functions <c>adding_handler/1</c>, <c>changing_config/2</c>        and <c>removing_handler/1</c>. See        section <seealso marker="logger#handler_callback_functions">Handler        Callback Functions</seealso> in the logger(3) manual for more @@ -738,22 +738,22 @@ ok</pre>      <code>log(logger:log(),logger:config()) ->ok</code>      <p>It may also implement the following callbacks:</p>      <code> -adding_handler(logger:handler_id(),logger:config()) -> {ok,logger:config()} | {error,term()} -removing_handler(logger:handler_id(),logger:config()) -> ok -changing_config(logger:handler_id(),logger:config(),logger:config()) -> {ok,logger:config()} | {error,term()} +adding_handler(logger:config()) -> {ok,logger:config()} | {error,term()} +removing_handler(logger:config()) -> ok +changing_config(logger:config(),logger:config()) -> {ok,logger:config()} | {error,term()}      </code>      <p>When <c>logger:add_handler(Id,Module,Config)</c> is called, Logger -      will first call <c>HModule:adding_handler(Id,Config)</c>, and if it +      will first call <c>HModule:adding_handler(Config)</c>, and if it        returns <c>{ok,NewConfig}</c>, <c>NewConfig</c> is written to the        configuration database. After this, the handler may receive log        events as calls to <c>HModule:log/2</c>.</p>      <p>A handler can be removed by calling        <c>logger:remove_handler(Id)</c>. Logger will call -      <c>HModule:removing_handler(Id,Config)</c>, and then remove the +      <c>HModule:removing_handler(Config)</c>, and then remove the        handler's configuration from the configuration database.</p>      <p>When <c>logger:set_handler_config/2,3</c>        or <c>logger:update_handler_config/2</c> are called, Logger -      calls <c>HModule:changing_config(Id,OldConfig,NewConfig)</c>. If +      calls <c>HModule:changing_config(OldConfig,NewConfig)</c>. If        this function returns <c>{ok,NewConfig}</c>, <c>NewConfig</c> is        written to the configuration database.</p> @@ -771,14 +771,14 @@ log(Log,#{formatter:={FModule,FConfig}) ->        this:</p>      <code>  -module(myhandler). --export([adding_handler/2, removing_handler/2, log/2]). +-export([adding_handler/1, removing_handler/1, log/2]).  -export([init/1, handle_call/3, handle_cast/2, terminate/2]). -adding_handler(Id,Config) -> +adding_handler(Config) ->      {ok,Fd} = file:open(File,[append,{encoding,utf8}]),      {ok,Config#{myhandler_fd=>Fd}}. -removing_handler(Id,#{myhandler_fd:=Fd}) -> +removing_handler(#{myhandler_fd:=Fd}) ->      _ = file:close(Fd),      ok. @@ -800,14 +800,14 @@ log(Log,#{myhandler_fd:=Fd,formatter:={FModule,FConfig}}) ->        single process.</p>      <code>  -module(myhandler). --export([adding_handler/2, removing_handler/2, log/2]). +-export([adding_handler/1, removing_handler/1, log/2]).  -export([init/1, handle_call/3, handle_cast/2, terminate/2]). -adding_handler(Id,Config) -> +adding_handler(Config) ->      {ok,Pid} = gen_server:start(?MODULE,Config),      {ok,Config#{myhandler_pid=>Pid}}. -removing_handler(Id,#{myhandler_pid:=Pid}) -> +removing_handler(#{myhandler_pid:=Pid}) ->      gen_server:stop(Pid).  log(Log,#{myhandler_pid:=Pid} = Config) -> diff --git a/lib/kernel/src/error_logger.erl b/lib/kernel/src/error_logger.erl index 6c3b308308..96f6536e61 100644 --- a/lib/kernel/src/error_logger.erl +++ b/lib/kernel/src/error_logger.erl @@ -32,7 +32,7 @@           which_report_handlers/0]).  %% logger callbacks --export([adding_handler/2, removing_handler/2, log/2]). +-export([adding_handler/1, removing_handler/1, log/2]).  -export([get_format_depth/0, limit_term/1]). @@ -101,9 +101,9 @@ stop() ->  %%%-----------------------------------------------------------------  %%% Callbacks for logger --spec adding_handler(logger:handler_id(),logger:config()) -> +-spec adding_handler(logger:config()) ->                              {ok,logger:config()} | {error,term()}. -adding_handler(?MODULE,Config) -> +adding_handler(#{id:=?MODULE}=Config) ->      case start() of          ok ->              {ok,Config}; @@ -111,8 +111,8 @@ adding_handler(?MODULE,Config) ->              Error      end. --spec removing_handler(logger:handler_id(),logger:config()) -> ok. -removing_handler(?MODULE,_Config) -> +-spec removing_handler(logger:config()) -> ok. +removing_handler(#{id:=?MODULE}) ->      stop(),      ok. diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl index 9c721d7fee..f22fd5e8de 100644 --- a/lib/kernel/src/logger.erl +++ b/lib/kernel/src/logger.erl @@ -90,7 +90,8 @@  -type filter() :: {fun((log(),filter_arg()) -> filter_return()),filter_arg()}.  -type filter_arg() :: term().  -type filter_return() :: stop | ignore | log(). --type config() :: #{level => level(), +-type config() :: #{id => handler_id(), +                    level => level(),                      filter_default => log | stop,                      filters => [{filter_id(),filter()}],                      formatter => {module(),formatter_config()}, diff --git a/lib/kernel/src/logger_disk_log_h.erl b/lib/kernel/src/logger_disk_log_h.erl index 57c54ce27e..37a147e3dc 100644 --- a/lib/kernel/src/logger_disk_log_h.erl +++ b/lib/kernel/src/logger_disk_log_h.erl @@ -34,8 +34,8 @@  %% logger callbacks  -export([log/2, -         adding_handler/2, removing_handler/2, -         changing_config/3, swap_buffer/2]). +         adding_handler/1, removing_handler/1, +         changing_config/2, swap_buffer/2]).  %%%===================================================================  %%% API @@ -108,8 +108,8 @@ reset(Name) ->  %%%-----------------------------------------------------------------  %%% Handler being added -adding_handler(Name, Config) -> -    case check_config(adding, Name, Config) of +adding_handler(#{id:=Name}=Config) -> +    case check_config(adding, Config) of          {ok, Config1} ->              %% create initial handler state by merging defaults with config              HConfig = maps:get(?MODULE, Config1, #{}), @@ -136,10 +136,9 @@ adding_handler(Name, Config) ->  %%%-----------------------------------------------------------------  %%% Updating handler config -changing_config(Name, -                OldConfig=#{id:=Id, disk_log_opts:=DLOpts}, -                NewConfig=#{id:=Id, disk_log_opts:=DLOpts}) -> -    case check_config(changing, Name, NewConfig) of +changing_config(OldConfig=#{id:=Name, disk_log_opts:=DLOpts}, +                NewConfig=#{id:=Name, disk_log_opts:=DLOpts}) -> +    case check_config(changing, NewConfig) of          Result = {ok,NewConfig1} ->              try gen_server:call(Name, {change_config,OldConfig,NewConfig1},                                  ?DEFAULT_CALL_TIMEOUT) of @@ -151,12 +150,10 @@ changing_config(Name,          Error ->              Error      end; -changing_config(_Name, OldConfig, NewConfig) -> +changing_config(OldConfig, NewConfig) ->      {error,{illegal_config_change,OldConfig,NewConfig}}. -check_config(adding, Name, Config0) -> -    %% Merge in defaults on top level -    Config = maps:merge(#{id => Name}, Config0), +check_config(adding, #{id:=Name}=Config) ->      %% Merge in defaults on handler level      LogOpts0 = maps:get(disk_log_opts, Config, #{}),      LogOpts = merge_default_logopts(Name, LogOpts0), @@ -173,7 +170,7 @@ check_config(adding, Name, Config0) ->          Error ->              Error      end; -check_config(changing, _Name, Config) -> +check_config(changing, Config) ->      MyConfig = maps:get(?MODULE, Config, #{}),      case check_my_config(maps:to_list(MyConfig)) of          ok    -> {ok,Config}; @@ -223,7 +220,7 @@ check_my_config([]) ->  %%%-----------------------------------------------------------------  %%% Handler being removed -removing_handler(Name, _Config) -> +removing_handler(#{id:=Name}) ->      stop(Name).  %%%----------------------------------------------------------------- diff --git a/lib/kernel/src/logger_server.erl b/lib/kernel/src/logger_server.erl index 16f61abdd6..9182b0b486 100644 --- a/lib/kernel/src/logger_server.erl +++ b/lib/kernel/src/logger_server.erl @@ -134,7 +134,7 @@ init([]) ->                                   filters=>?DEFAULT_HANDLER_FILTERS}),      %% If this fails, then the node should crash      {ok,SimpleConfig} = -        logger_simple:adding_handler(logger_simple,SimpleConfig0), +        logger_simple:adding_handler(SimpleConfig0),      logger_config:create(Tid,logger_simple,logger_simple,SimpleConfig),      {ok, #state{tid=Tid, async_req_queue = queue:new()}}. @@ -146,7 +146,7 @@ handle_call({add_handler,Id,Module,HConfig}, From, #state{tid=Tid}=State) ->              call_h_async(                fun() ->                        %% inform the handler -                      call_h(Module,adding_handler,[Id,HConfig],{ok,HConfig}) +                      call_h(Module,adding_handler,[HConfig],{ok,HConfig})                end,                fun({ok,HConfig1}) ->                        %% We know that the call_h would have loaded the module @@ -177,7 +177,7 @@ handle_call({remove_handler,HandlerId}, From, #state{tid=Tid}=State) ->              call_h_async(                fun() ->                        %% inform the handler -                      call_h(Module,removing_handler,[HandlerId,HConfig],ok) +                      call_h(Module,removing_handler,[HConfig],ok)                end,                fun(_Res) ->                        do_set_config(Tid,logger,Config#{handlers=>Handlers}), @@ -213,7 +213,7 @@ handle_call({set_config,HandlerId,Config}, From, #state{tid=Tid}=State) ->          {ok,{Module,OldConfig}} ->              call_h_async(                fun() -> -                      call_h(Module,changing_config,[HandlerId,OldConfig,Config], +                      call_h(Module,changing_config,[OldConfig,Config],                               {ok,Config})                end,                fun({ok,Config1}) -> @@ -348,8 +348,9 @@ default_config(logger) ->      #{level=>info,        filters=>[],        filter_default=>log}; -default_config(_) -> -    #{level=>info, +default_config(Id) -> +    #{id=>Id, +      level=>info,        filters=>[],        filter_default=>log,        formatter=>{?DEFAULT_FORMATTER,#{}}}. diff --git a/lib/kernel/src/logger_simple.erl b/lib/kernel/src/logger_simple.erl index c8cdf25887..cfb3fcb620 100644 --- a/lib/kernel/src/logger_simple.erl +++ b/lib/kernel/src/logger_simple.erl @@ -19,7 +19,7 @@  %%  -module(logger_simple). --export([adding_handler/2, removing_handler/2, log/2]). +-export([adding_handler/1, removing_handler/1, log/2]).  %% This module implements a simple handler for logger. It is the  %% default used during system start. @@ -27,7 +27,7 @@  %%%-----------------------------------------------------------------  %%% Logger callback -adding_handler(?MODULE,Config) -> +adding_handler(#{id:=?MODULE}=Config) ->      Me = self(),      case whereis(?MODULE) of          undefined -> @@ -44,7 +44,7 @@ adding_handler(?MODULE,Config) ->              {error,{handler_process_name_already_exists,?MODULE}}      end. -removing_handler(?MODULE,_Config) -> +removing_handler(#{id:=?MODULE}) ->      case whereis(?MODULE) of          undefined ->              ok; diff --git a/lib/kernel/src/logger_std_h.erl b/lib/kernel/src/logger_std_h.erl index e5e0febc88..fc8ca1535b 100644 --- a/lib/kernel/src/logger_std_h.erl +++ b/lib/kernel/src/logger_std_h.erl @@ -35,8 +35,8 @@           terminate/2, code_change/3]).  %% logger callbacks --export([log/2, adding_handler/2, removing_handler/2, -         changing_config/3, swap_buffer/2]). +-export([log/2, adding_handler/1, removing_handler/1, +         changing_config/2, swap_buffer/2]).  %%%===================================================================  %%% API @@ -109,8 +109,8 @@ reset(Name) ->  %%%-----------------------------------------------------------------  %%% Handler being added -adding_handler(Name, Config) -> -    case check_config(adding, Name, Config) of +adding_handler(#{id:=Name}=Config) -> +    case check_config(adding, Config) of          {ok, Config1} ->              %% create initial handler state by merging defaults with config              HConfig = maps:get(?MODULE, Config1, #{}), @@ -137,9 +137,8 @@ adding_handler(Name, Config) ->  %%%-----------------------------------------------------------------  %%% Updating handler config -changing_config(Name, -                OldConfig=#{id:=Id, ?MODULE:=#{type:=Type}}, -                NewConfig=#{id:=Id}) -> +changing_config(OldConfig=#{id:=Name, ?MODULE:=#{type:=Type}}, +                NewConfig=#{id:=Name}) ->      MyConfig = maps:get(?MODULE, NewConfig, #{}),      case maps:get(type, MyConfig, Type) of          Type -> @@ -149,11 +148,11 @@ changing_config(Name,          _ ->              {error,{illegal_config_change,OldConfig,NewConfig}}      end; -changing_config(_Name, OldConfig, NewConfig) -> +changing_config(OldConfig, NewConfig) ->      {error,{illegal_config_change,OldConfig,NewConfig}}.  changing_config1(Name, OldConfig, NewConfig) -> -    case check_config(changing, Name, NewConfig) of +    case check_config(changing, NewConfig) of          Result = {ok,NewConfig1} ->              try gen_server:call(Name, {change_config,OldConfig,NewConfig1},                                  ?DEFAULT_CALL_TIMEOUT) of @@ -166,9 +165,7 @@ changing_config1(Name, OldConfig, NewConfig) ->              Error      end.     -check_config(adding, Name, Config0) -> -    %% Merge in defaults on top level -    Config = maps:merge(#{id => Name}, Config0), +check_config(adding, Config) ->      %% Merge in defaults on handler level      MyConfig0 = maps:get(?MODULE, Config, #{}),      MyConfig = maps:merge(#{type => standard_io}, @@ -179,7 +176,7 @@ check_config(adding, Name, Config0) ->          Error ->              Error      end; -check_config(changing, _Name, Config) -> +check_config(changing, Config) ->      MyConfig = maps:get(?MODULE, Config, #{}),      case check_my_config(maps:to_list(MyConfig)) of          ok    -> {ok,Config}; @@ -207,7 +204,7 @@ check_my_config([]) ->  %%%-----------------------------------------------------------------  %%% Handler being removed -removing_handler(Name,_Config) -> +removing_handler(#{id:=Name}) ->      stop(Name).  %%%----------------------------------------------------------------- diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl index 66eee8219a..f7ec59a7b7 100644 --- a/lib/kernel/test/logger_SUITE.erl +++ b/lib/kernel/test/logger_SUITE.erl @@ -839,20 +839,20 @@ check_maps(Expected,Got,What) ->      end.  %% Handler -adding_handler(_Id,#{add_call:=Fun}) -> +adding_handler(#{add_call:=Fun}) ->      Fun(); -adding_handler(_Id,Config) -> +adding_handler(Config) ->      maybe_send(add),      {ok,Config}. -removing_handler(_Id,#{rem_call:=Fun}) -> +removing_handler(#{rem_call:=Fun}) ->      Fun(); -removing_handler(_Id,_Config) -> +removing_handler(_Config) ->      maybe_send(remove),      ok. -changing_config(_Id,_Old,#{conf_call:=Fun}) -> +changing_config(_Old,#{conf_call:=Fun}) ->      Fun(); -changing_config(_Id,_Old,Config) -> +changing_config(_Old,Config) ->      maybe_send(changing_config),      {ok,Config}.  | 
