@ -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 , _ Tim e, Mes sa ge , _ Metadata } = lager_test_backend : pop ( ) ,
? assertEqual ( " Lager event handler lager_crash_backend exited with reason crash " , lists : flatten ( Mes sa ge ) ) ,
{ _ Level2 , _ Tim e2, Mes sa ge 2 , _ Metadata } = lager_test_backend : pop ( ) ,
? assertMatch ( " Lager failed to install handler lager_crash_backend into lager_event, retrying later : " ++ _ , lists : flatten ( Mes sa ge 2 ) ) ,
{ _ Severity , _ Dat e, Msg , _ Metadata } = lager_test_backend : pop ( ) ,
? assertEqual ( " Lager event handler lager_crash_backend exited with reason crash " , lists : flatten ( Msg ) ) ,
{ _ Severity2 , _ Dat e2, 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 ) ,