error_logger_mon.erl 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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([
  11. start_link/0,
  12. report/1,
  13. get_msg_count/0,
  14. get_msgs/0,
  15. reset/0,
  16. stop/0,
  17. install_handler/0,
  18. install_handler/1,
  19. uninstall_handler/0
  20. ]).
  21. %% OTP logger
  22. -export([log/2]).
  23. %% gen_server
  24. -export([
  25. init/1,
  26. handle_call/3,
  27. handle_cast/2,
  28. handle_info/2,
  29. terminate/2,
  30. code_change/3
  31. ]).
  32. %% Logger handler
  33. log(Event, _) ->
  34. error_logger_mon:report(Event),
  35. ok.
  36. %% ------------------------------------------------------------------
  37. %% API Function Definitions
  38. %% ------------------------------------------------------------------
  39. start_link() ->
  40. gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
  41. report(Event) ->
  42. gen_server:call(?SERVER, {report, Event}).
  43. get_msg_count() ->
  44. gen_server:call(?SERVER, get_count).
  45. get_msgs() ->
  46. gen_server:call(?SERVER, get_events).
  47. reset() ->
  48. gen_server:call(?SERVER, reset).
  49. stop() ->
  50. gen_server:call(?SERVER, stop).
  51. install_handler() ->
  52. install_handler(error_logger).
  53. install_handler(FilterName) ->
  54. logger:add_handler(
  55. ?MODULE,
  56. ?MODULE,
  57. #{
  58. level => all,
  59. filter_default => stop,
  60. filters => [{FilterName, filter(FilterName)}]
  61. }
  62. ).
  63. filter(error_logger) ->
  64. {fun error_logger_filter/2, []};
  65. filter(pooler) ->
  66. {fun logger_filters:domain/2, {log, sub, [pooler]}}.
  67. uninstall_handler() ->
  68. logger:remove_handler(?MODULE).
  69. error_logger_filter(#{meta := #{error_logger := #{tag := _}}} = E, _) ->
  70. E;
  71. error_logger_filter(_, _) ->
  72. ignore.
  73. %% ------------------------------------------------------------------
  74. %% gen_server Function Definitions
  75. %% ------------------------------------------------------------------
  76. init([]) ->
  77. {ok, #state{}}.
  78. handle_call(get_count, _From, #state{events = E} = State) ->
  79. {reply, length(E), State};
  80. handle_call(get_events, _From, #state{events = E} = State) ->
  81. {reply, E, State};
  82. handle_call({report, Event}, _From, #state{events = E} = State) ->
  83. {reply, ok, State#state{events = [Event | E]}};
  84. handle_call(reset, _From, State) ->
  85. {reply, ok, State#state{events = []}};
  86. handle_call(stop, _From, State) ->
  87. {stop, normal, ok, State};
  88. handle_call(_Request, _From, State) ->
  89. {reply, error, State}.
  90. handle_cast(_Msg, State) ->
  91. {noreply, State}.
  92. handle_info(_Info, State) ->
  93. {noreply, State}.
  94. terminate(_Reason, _State) ->
  95. ok.
  96. code_change(_OldVsn, State, _Extra) ->
  97. {ok, State}.