From ccdc4d4c8f4309564f90280ea2a61de57d617763 Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Tue, 23 Apr 2013 21:23:36 -0400 Subject: [PATCH] Rework the 'old shell' warning, and some related work Add ability for handlers to 'fatally' fail, so they won't attempt to reinstall themselves later. Also fix an issue with the INT_LOG macro not doing the right thing when only the lager_throttle_backend was installed. --- include/lager.hrl | 2 +- src/lager_console_backend.erl | 36 +++++++++++-------------------- src/lager_file_backend.erl | 2 +- src/lager_handler_watcher.erl | 22 +++++++++++++------ src/lager_handler_watcher_sup.erl | 2 +- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/include/lager.hrl b/include/lager.hrl index ac84d98..ade93e1 100644 --- a/include/lager.hrl +++ b/include/lager.hrl @@ -84,7 +84,7 @@ %% from a gen_event handler spawn(fun() -> case catch(gen_event:which_handlers(lager_event)) of - X when X == []; X == {'EXIT', noproc} -> + X when X == []; X == {'EXIT', noproc}; X == [lager_backend_throttle] -> %% there's no handlers yet or lager isn't running, try again %% in half a second. timer:sleep(500), diff --git a/src/lager_console_backend.erl b/src/lager_console_backend.erl index c0dc4e1..c64fe9c 100644 --- a/src/lager_console_backend.erl +++ b/src/lager_console_backend.erl @@ -40,13 +40,6 @@ init([Level, true]) -> % for backwards compatibility init([Level,false]) -> % for backwards compatibility init([Level,{lager_default_formatter,?TERSE_FORMAT ++ [eol()]}]); init([Level,{Formatter,FormatterConfig}]) when is_atom(Formatter) -> - IsSafe = case is_new_style_console_available() of - false=Res -> - spawn(fun warn_user/0), - Res; - Res -> - Res - end, Colors = case application:get_env(lager, colored) of {ok, true} -> {ok, LagerColors} = application:get_env(lager, colors), @@ -54,9 +47,19 @@ init([Level,{Formatter,FormatterConfig}]) when is_atom(Formatter) -> _ -> [] end, - try {IsSafe, lager_util:config_to_mask(Level)} of + try {is_new_style_console_available(), lager_util:config_to_mask(Level)} of {false, _} -> - {error, "Old style console was detected"}; + Msg = "Lager's console backend is incompatible with the 'old' shell, not enabling it", + %% be as noisy as possible, log to every possible place + try + alarm_handler:set_alarm({?MODULE, "WARNING: " ++ Msg}) + catch + _:_ -> + error_logger:warning_msg(Msg ++ "~n") + end, + io:format("WARNING: " ++ Msg ++ "~n"), + ?INT_LOG(warning, Msg, []), + {error, {fatal, old_shell}}; {true, Levels} -> {ok, #state{level=Levels, formatter=Formatter, @@ -64,7 +67,7 @@ init([Level,{Formatter,FormatterConfig}]) when is_atom(Formatter) -> colors=Colors}} catch _:_ -> - {error, bad_log_level} + {error, {fatal, bad_log_level}} end; init(Level) -> init([Level,{lager_default_formatter,?TERSE_FORMAT ++ [eol()]}]). @@ -134,19 +137,6 @@ is_new_style_console_available() -> is_pid(whereis(user_drv)). -endif. -warn_user() -> - Msg = lists:flatten( - io_lib:format("WARNING: old-style console is in use, so ~s " - "log output to the console is disabled. " - "Restart the VM on a pseudo-tty to ensure " - "use of the new-style VM console.", - [?MODULE])), - catch alarm_handler:set_alarm({?MODULE, Msg}), - [begin - error_logger:warning_msg(Msg), - timer:sleep(1000) - end || _ <- lists:seq(1, 10)]. - -ifdef(TEST). console_log_test_() -> %% tiny recursive fun that pretends to be a group leader diff --git a/src/lager_file_backend.erl b/src/lager_file_backend.erl index b8a3411..6e1d2ef 100644 --- a/src/lager_file_backend.erl +++ b/src/lager_file_backend.erl @@ -99,7 +99,7 @@ init(LogFileConfig) when is_list(LogFileConfig) -> case validate_logfile_proplist(LogFileConfig) of false -> %% falied to validate config - {error, bad_config}; + {error, {fatal, bad_config}}; Config -> %% probabably a better way to do this, but whatever [Name, Level, Date, Size, Count, SyncInterval, SyncSize, SyncOn, CheckInterval, Formatter, FormatterConfig] = diff --git a/src/lager_handler_watcher.erl b/src/lager_handler_watcher.erl index 2086346..ac34119 100644 --- a/src/lager_handler_watcher.erl +++ b/src/lager_handler_watcher.erl @@ -23,6 +23,8 @@ -behaviour(gen_server). +-include("lager.hrl"). + -ifdef(TEST). -include_lib("eunit/include/eunit.hrl"). -endif. @@ -73,6 +75,8 @@ handle_info({gen_event_EXIT, Module, Reason}, #state{module=Module, handle_info(reinstall_handler, #state{module=Module, config=Config, event=Event} = State) -> install_handler(Event, Module, Config), {noreply, State}; +handle_info(stop, State) -> + {stop, normal, State}; handle_info(_Info, State) -> {noreply, State}. @@ -87,12 +91,18 @@ code_change(_OldVsn, State, _Extra) -> install_handler(Event, Module, Config) -> case gen_event:add_sup_handler(Event, Module, Config) of ok -> - _ = lager:log(debug, self(), "Lager installed handler ~p into ~p", [Module, Event]), + ?INT_LOG(debug, "Lager installed handler ~p into ~p", [Module, Event]), lager:update_loglevel_config(), ok; + {error, {fatal, Reason}} -> + ?INT_LOG(error, "Lager fatally failed to install handler ~p into" + " ~p, NOT retrying: ~p", [Module, Event, Reason]), + %% tell ourselves to stop + self() ! stop, + ok; Error -> %% try to reinstall it later - _ = lager:log(error, self(), "Lager failed to install handler ~p into" + ?INT_LOG(error, "Lager failed to install handler ~p into" " ~p, retrying later : ~p", [Module, Event, Error]), erlang:send_after(5000, self(), reinstall_handler), ok @@ -145,10 +155,10 @@ reinstall_on_runtime_failure_test_() -> ?assert(lists:member(lager_crash_backend, gen_event:which_handlers(lager_event))), timer:sleep(6000), ?assertEqual(2, lager_test_backend:count()), - {_Level, _Time, Message, _Metadata} = lager_test_backend:pop(), - ?assertEqual("Lager event handler lager_crash_backend exited with reason crash", lists:flatten(Message)), - {_Level2, _Time2, Message2, _Metadata} = lager_test_backend:pop(), - ?assertMatch("Lager failed to install handler lager_crash_backend into lager_event, retrying later :"++_, lists:flatten(Message2)), + {_Severity, _Date, Msg, _Metadata} = lager_test_backend:pop(), + ?assertEqual("Lager event handler lager_crash_backend exited with reason crash", lists:flatten(Msg)), + {_Severity2, _Date2, Msg2, _Metadata2} = lager_test_backend:pop(), + ?assertMatch("Lager failed to install handler lager_crash_backend into lager_event, retrying later :"++_, lists:flatten(Msg2)), ?assertEqual(false, lists:member(lager_crash_backend, gen_event:which_handlers(lager_event))) after application:stop(lager), diff --git a/src/lager_handler_watcher_sup.erl b/src/lager_handler_watcher_sup.erl index b3161ae..f3763aa 100644 --- a/src/lager_handler_watcher_sup.erl +++ b/src/lager_handler_watcher_sup.erl @@ -35,5 +35,5 @@ init([]) -> {ok, {{simple_one_for_one, 10, 60}, [ {lager_handler_watcher, {lager_handler_watcher, start_link, []}, - transient, 5000, worker, [lager_handler_watcher]} + temporary, 5000, worker, [lager_handler_watcher]} ]}}.