error_logger_mon.erl 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. %%% A gen_server to check if we get any error_logger messages during test to see if
  2. %%% any messages gets generated when they shouldn't
  3. -module(error_logger_mon).
  4. -behaviour(gen_server).
  5. -define(SERVER, ?MODULE).
  6. -record(state, {events = [] :: [logger:log_event()]}).
  7. %% ------------------------------------------------------------------
  8. %% API Function Exports
  9. %% ------------------------------------------------------------------
  10. -export([start_link/0,
  11. report/1,
  12. get_msg_count/0,
  13. get_msgs/0,
  14. reset/0,
  15. stop/0,
  16. install_handler/0,
  17. install_handler/1,
  18. uninstall_handler/0
  19. ]).
  20. %% OTP logger
  21. -export([log/2]).
  22. %% gen_server
  23. -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
  24. terminate/2, code_change/3]).
  25. %% Logger handler
  26. log(Event, _) ->
  27. error_logger_mon:report(Event),
  28. ok.
  29. %% ------------------------------------------------------------------
  30. %% API Function Definitions
  31. %% ------------------------------------------------------------------
  32. start_link() ->
  33. gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  34. report(Event) ->
  35. gen_server:call(?SERVER, {report, Event}).
  36. get_msg_count() ->
  37. gen_server:call(?SERVER, get_count).
  38. get_msgs() ->
  39. gen_server:call(?SERVER, get_events).
  40. reset() ->
  41. gen_server:call(?SERVER, reset).
  42. stop() ->
  43. gen_server:call(?SERVER, stop).
  44. install_handler() ->
  45. install_handler(error_logger).
  46. install_handler(FilterName) ->
  47. logger:add_handler(
  48. ?MODULE,
  49. ?MODULE,
  50. #{level => all,
  51. filter_default => stop,
  52. filters => [{FilterName, filter(FilterName)}]}).
  53. filter(error_logger) ->
  54. {fun error_logger_filter/2, []};
  55. filter(pooler) ->
  56. {fun logger_filters:domain/2, {log, sub, [pooler]}}.
  57. uninstall_handler() ->
  58. logger:remove_handler(?MODULE).
  59. error_logger_filter(#{meta := #{error_logger := #{tag := _}}} = E, _) ->
  60. E;
  61. error_logger_filter(_, _) ->
  62. ignore.
  63. %% ------------------------------------------------------------------
  64. %% gen_server Function Definitions
  65. %% ------------------------------------------------------------------
  66. init([]) ->
  67. {ok, #state{}}.
  68. handle_call(get_count, _From, #state{events = E} = State) ->
  69. {reply, length(E), State};
  70. handle_call(get_events, _From, #state{events = E} = State) ->
  71. {reply, E, State};
  72. handle_call({report, Event}, _From, #state{events = E} = State) ->
  73. {reply, ok, State#state{events = [Event | E]}};
  74. handle_call(reset, _From, State) ->
  75. {reply, ok, State#state{events = []}};
  76. handle_call(stop, _From, State) ->
  77. {stop, normal, ok, State};
  78. handle_call(_Request, _From, State) ->
  79. {reply, error, State}.
  80. handle_cast(_Msg, State) ->
  81. {noreply, State}.
  82. handle_info(_Info, State) ->
  83. {noreply, State}.
  84. terminate(_Reason, _State) ->
  85. ok.
  86. code_change(_OldVsn, State, _Extra) ->
  87. {ok, State}.