Przeglądaj źródła

Force restart of system after a watcher kill.

This is, perhaps, not the most ideal setup. It still ignores other
sinks but does bring logging back online after the appropriate delay.

Signed-off-by: Brian L. Troutwine <brian.troutwine@adroll.com>
pull/328/head
Brian L. Troutwine 9 lat temu
rodzic
commit
101dba232e
3 zmienionych plików z 17 dodań i 7 usunięć
  1. +6
    -3
      src/lager_app.erl
  2. +4
    -4
      src/lager_handler_watcher.erl
  3. +7
    -0
      src/lager_manager_killer.erl

+ 6
- 3
src/lager_app.erl Wyświetl plik

@ -28,7 +28,8 @@
-export([start/0,
start/2,
start_handler/3,
stop/1]).
stop/1,
boot/0]).
-define(FILENAMES, '__lager_file_backend_filenames').
-define(THROTTLE, lager_backend_throttle).
@ -220,7 +221,10 @@ get_env_default({ok, Value}, _Default) ->
start(_StartType, _StartArgs) ->
{ok, Pid} = lager_sup:start_link(),
SavedHandlers = boot(),
{ok, Pid, SavedHandlers}.
boot() ->
%% Handle the default sink.
determine_async_behavior(?DEFAULT_SINK,
application:get_env(lager, async_threshold),
@ -246,8 +250,7 @@ start(_StartType, _StartArgs) ->
clean_up_config_checks(),
{ok, Pid, SavedHandlers}.
SavedHandlers.
stop(Handlers) ->
lists:foreach(fun(Handler) ->

+ 4
- 4
src/lager_handler_watcher.erl Wyświetl plik

@ -63,11 +63,11 @@ handle_info({gen_event_EXIT, Module, shutdown}, #state{module=Module} = State) -
{stop, normal, State};
handle_info({gen_event_EXIT, Module, {'EXIT', {kill_me, [_KillerHWM, KillerReinstallAfter]}}},
#state{module=Module, sink=Sink} = State) ->
% Brutally kill the manager but stay alive to restore settings.
%% Brutally kill the manager but stay alive to restore settings.
Manager = whereis(Sink),
unlink(Manager),
exit(Manager, kill),
erlang:send_after(KillerReinstallAfter, self(), reinstall_handler),
erlang:send_after(KillerReinstallAfter, self(), reboot),
{noreply, State};
handle_info({gen_event_EXIT, Module, Reason}, #state{module=Module,
config=Config, sink=Sink} = State) ->
@ -80,8 +80,8 @@ handle_info({gen_event_EXIT, Module, Reason}, #state{module=Module,
ok
end,
{noreply, State};
handle_info(reinstall_handler, #state{module=Module, config=Config, sink=Sink} = State) ->
install_handler(Sink, Module, Config),
handle_info(reboot, State) ->
lager_app:boot(),
{noreply, State};
handle_info(stop, State) ->
{stop, normal, State};

+ 7
- 0
src/lager_manager_killer.erl Wyświetl plik

@ -4,6 +4,8 @@
-export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]).
-export([kill_me/0]).
-include("lager.hrl").
-record(state, {
@ -11,6 +13,9 @@
killer_reinstall_after :: non_neg_integer()
}).
kill_me() ->
gen_event:call(lager_event, ?MODULE, kill_self).
init([KillerHWM, KillerReinstallAfter]) ->
{ok, #state{killer_hwm=KillerHWM, killer_reinstall_after=KillerReinstallAfter}}.
@ -20,6 +25,8 @@ handle_call({set_loglevel, _Level}, State) ->
{ok, ok, State};
handle_call(get_settings, State = #state{killer_hwm=KillerHWM, killer_reinstall_after=KillerReinstallAfter}) ->
{ok, [KillerHWM, KillerReinstallAfter], State};
handle_call(kill_self, #state{killer_hwm=KillerHWM, killer_reinstall_after=KillerReinstallAfter}) ->
exit({kill_me, [KillerHWM, KillerReinstallAfter]});
handle_call(_Request, State) ->
{ok, ok, State}.

Ładowanie…
Anuluj
Zapisz