Browse Source

mad_repl: do the rebar3 remove/reset dance for logger

Vlad Ki 6 years ago
parent
commit
3a319b344a
1 changed files with 13 additions and 0 deletions
  1. 13 0
      src/provide/mad_repl.erl

+ 13 - 0
src/provide/mad_repl.erl

@@ -117,6 +117,7 @@ sh(Params) ->
     Config = load_sysconfig(),
     application_config(Config),
     Driver = mad_utils:get_value(shell_driver,_Config,user_drv),
+    Logger = maybe_remove_logger(),
     repl_intro(Config),
     case os:type() of
          {win32,nt} -> os:cmd("chcp 65001"), shell:start();
@@ -125,11 +126,23 @@ sh(Params) ->
                        Driver:start(),
                        wait(3000),
                        rewrite_leaders(O,whereis(user)) end,
+    maybe_reset_logger(Logger),
     load_apps(Params,Config,[]),
     case Params of
         ["applist"] -> skip;
         _ ->  timer:sleep(infinity) end end.
 
+%% credits: https://github.com/erlang/rebar3/commit/1b6e3ac9c0e3b77215b119427b9a4d530cb08e1d#diff-e76e94656cd6ae25cfb09092fda3091e
+maybe_remove_logger() ->
+    case erlang:function_exported(logger, module_info, 0) of
+         false -> ignore;
+         true  -> {ok, Cfg} = logger:get_handler_config(default),
+                  logger:remove_handler(default),
+                  {restart, Cfg} end.
+
+maybe_reset_logger(ignore) -> ok;
+maybe_reset_logger({restart, #{module := Mod, config := Cfg}}) -> logger:add_handler(default, Mod, Cfg).
+
 remove(0) -> skip;
 remove(N) -> case gen_event:delete_handler(error_logger, error_logger, []) of
                   {error, module_not_found} -> ok;