rewrite from lager
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.8 KiB

4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
4 년 전
  1. -module(lgBkdThrottle).
  2. %% @doc一个简单的gen_event后端,用于监视邮箱大小和在同步和异步模式之间切换日志消息。
  3. %%使用gen_event处理程序是因为进程获得了自己的邮箱的大小不涉及获取锁定,
  4. %% 并且gen_event处理程序在其中运行parent's的进程里。
  5. -behaviour(gen_emm).
  6. -include("lgDef.hrl").
  7. -compile(inline).
  8. -compile({inline_size, 128}).
  9. -export([
  10. init/1
  11. , handleCall/2
  12. , handleEvent/2
  13. , handleInfo/2
  14. , terminate/2
  15. , code_change/3
  16. ]).
  17. -record(state, {
  18. sink :: atom(),
  19. hwm :: non_neg_integer(),
  20. window :: non_neg_integer(),
  21. async = true :: boolean()
  22. }).
  23. init([Sink, Hwm, Window]) ->
  24. lgConfig:ptSet({Sink, async}, true),
  25. {ok, #state{sink = Sink, hwm = Hwm, window = Hwm - Window}}.
  26. handleCall(mGetLogLevel, State) ->
  27. {reply, ?llvNone, State};
  28. handleCall({mSetLogLevel, _Level}, State) ->
  29. {reply, ok, State};
  30. handleCall(_Msg, State) ->
  31. ?ERR(<<"~p call receive unexpect msg ~p ~n ">>, [?MODULE, _Msg]),
  32. {reply, ok, State}.
  33. handleEvent({mWriteLog, _Message}, #state{sink = Sink, hwm = Hwm, window = Window, async = Async} = State) ->
  34. {_, MsgLen} = erlang:process_info(self(), message_queue_len),
  35. if
  36. MsgLen > Hwm andalso Async ->
  37. %% need to flip to sync mode
  38. lgConfig:ptSet({Sink, async}, false),
  39. {ok, State#state{async = false}};
  40. MsgLen < Window andalso not Async ->
  41. %% need to flip to async mode
  42. lgConfig:ptSet({Sink, async}, true),
  43. {ok, State#state{async = true}};
  44. true ->
  45. %% nothing needs to change
  46. kpS
  47. end;
  48. handleEvent(_Event, _State) ->
  49. kpS.
  50. handleInfo(_Info, _State) ->
  51. kpS.
  52. terminate(_Reason, _State) ->
  53. ok.
  54. code_change(_OldVsn, State, _Extra) ->
  55. {ok, State}.