rewrite from lager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 regels
5.9 KiB

4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
4 jaren geleden
  1. -define(RumDefTruncation, 4096).
  2. -define(RumDefTracer, lager_default_tracer).
  3. -define(RumDefSink, lager_event).
  4. -define(RumErrLogSink, error_logger_lager_event).
  5. -define(RumMetadata(Extras), [
  6. {severity, info},
  7. {pid, self()},
  8. {node, node()},
  9. {module, ?MODULE},
  10. {function, ?FUNCTION_NAME},
  11. {function_arity, ?FUNCTION_ARITY},
  12. {file, ?FILE},
  13. {line, ?LINE} | Extras
  14. ]).
  15. -define(RumLevels, [debug, info, notice, warning, error, critical, alert, emergency, none]).
  16. %% 使用这些“功能”意味着,出于安全考虑,参数列表不会被截断
  17. -define(RumLevelsUnsafe, [{debug_unsafe, debug}, {info_unsafe, info}, {notice_unsafe, notice}, {warning_unsafe, warning}, {error_unsafe, error}, {critical_unsafe, critical}, {alert_unsafe, alert}, {emergency_unsafe, emergency}]).
  18. -define(DEBUG, 128).
  19. -define(INFO, 64).
  20. -define(NOTICE, 32).
  21. -define(WARNING, 16).
  22. -define(ERROR, 8).
  23. -define(CRITICAL, 4).
  24. -define(ALERT, 2).
  25. -define(EMERGENCY, 1).
  26. -define(LOG_NONE, 0).
  27. -define(RumLevelToNum(Level),
  28. case Level of
  29. debug -> ?DEBUG;
  30. info -> ?INFO;
  31. notice -> ?NOTICE;
  32. warning -> ?WARNING;
  33. error -> ?ERROR;
  34. critical -> ?CRITICAL;
  35. alert -> ?ALERT;
  36. emergency -> ?EMERGENCY
  37. end).
  38. -define(RumNumToLevel(Num),
  39. case Num of
  40. ?DEBUG -> debug;
  41. ?INFO -> info;
  42. ?NOTICE -> notice;
  43. ?WARNING -> warning;
  44. ?ERROR -> error;
  45. ?CRITICAL -> critical;
  46. ?ALERT -> alert;
  47. ?EMERGENCY -> emergency
  48. end).
  49. -define(RunShouldLog(Sink, Level), (rumUtil:level_to_num(Level) band element(1, rumConfig:get({Sink, loglevel}, {?LOG_NONE, []}))) /= 0).
  50. -define(RunShouldLog(Level), (rumUtil:level_to_num(Level) band element(1, rumConfig:get(loglevel, {?LOG_NONE, []}))) /= 0).
  51. -define(RunNotify(Level, Pid, Format, Args),
  52. gen_event:notify(lager_event, {log, rumMsg:new(io_lib:format(Format, Args), Level, [{pid, Pid}, {line, ?LINE}, {file, ?FILE}, {module, ?MODULE}], [])})).
  53. %%仅供内部使用仅内部非阻塞日志记录调用,当我们仍在启动大型啤酒时尝试进行日志记录(通常为错误)时,会有一些特殊处理。
  54. -ifdef(TEST).
  55. -define(INT_LOG(Level, Format, Args),
  56. case ?RunShouldLog(Level) of
  57. true ->
  58. ?RunNotify(Level, self(), Format, Args);
  59. _ ->
  60. ok
  61. end).
  62. -else.
  63. -define(INT_LOG(Level, Format, Args),
  64. Self = self(),
  65. %% do this in a spawn so we don't cause a deadlock calling gen_event:which_handlers
  66. %% from a gen_event handler
  67. spawn(fun() ->
  68. case catch (gen_event:which_handlers(lager_event)) of
  69. X when X == []; X == {'EXIT', noproc}; X == [lager_backend_throttle] ->
  70. %% there's no handlers yet or lager isn't running, try again
  71. %% in half a second.
  72. timer:sleep(500),
  73. ?RunNotify(Level, Self, Format, Args);
  74. _ ->
  75. case ?RunShouldLog(Level) of
  76. true ->
  77. ?RunNotify(Level, Self, Format, Args);
  78. _ ->
  79. ok
  80. end
  81. end
  82. end)).
  83. -endif.
  84. -define(rumLog(Severity, Format, Args, Safety),
  85. ?rumLog(?RumDefSink, Severity, ?RumMetadata(eRum:md()), Format, Args, ?RumDefTruncation, Safety)).
  86. -define(rumLog(Severity, Metadata, Format, Args, Safety),
  87. ?rumLog(?RumDefSink, Severity, ?RumMetadata(Metadata ++ eRum:md()), Format, Args, ?RumDefTruncation, Safety)).
  88. -define(rumLog(Sink, Severity, Metadata, Format, Args, Size, Safety),
  89. _ = eRum:dispatch_log(Sink, Severity, Metadata, Format, Args, Size, Safety)).
  90. -define(rumDebug(Format, Args), ?rumLog(debug, Format, Args, safe)).
  91. -define(rumDebug(Metadata, Format, Args), ?rumLog(debug, Metadata, Format, Args, safe)).
  92. -define(rumInfo(Format, Args), ?rumLog(info, Format, Args, safe)).
  93. -define(rumInfo(Metadata, Format, Args), ?rumLog(info, Metadata, Format, Args, safe)).
  94. -define(rumNotice(Format, Args), ?rumLog(notice, Format, Args, safe)).
  95. -define(rumNotice(Metadata, Format, Args), ?rumLog(notice, Metadata, Format, Args, safe)).
  96. -define(rumWarning(Format, Args), ?rumLog(warning, Format, Args, safe)).
  97. -define(rumWarning(Metadata, Format, Args), ?rumLog(warning, Metadata, Format, Args, safe)).
  98. -define(rumError(Format, Args), ?rumLog(error, Format, Args, safe)).
  99. -define(rumError(Metadata, Format, Args), ?rumLog(error, Metadata, Format, Args, safe)).
  100. -define(rumCritical(Format, Args), ?rumLog(critical, Format, Args, safe)).
  101. -define(rumCritical(Metadata, Format, Args), ?rumLog(critical, Metadata, Format, Args, safe)).
  102. -define(rumAlert(Format, Args), ?rumLog(alert, Format, Args, safe)).
  103. -define(rumAlert(Metadata, Format, Args), ?rumLog(alert, Metadata, Format, Args, safe)).
  104. -define(rumEmergency(Format, Args), ?rumLog(emergency, Format, Args, safe)).
  105. -define(rumEmergency(Metadata, Format, Args), ?rumLog(emergency, Metadata, Format, Args, safe)).
  106. -define(rumNone(Format, Args), ?rumLog(none, Format, Args, safe)).
  107. -define(rumNone(Metadata, Format, Args), ?rumLog(none, Metadata, Format, Args, safe)).
  108. -record(rumShaper, {
  109. id :: any()
  110. %% 每秒我们尝试传递多少消息
  111. , hwm = undefined :: 'undefined' | pos_integer()
  112. %% 这秒内我们收到了多少条消息
  113. , mps = 0 :: non_neg_integer()
  114. %% 当前秒
  115. , lastTime = os:timestamp() :: erlang:timestamp()
  116. %% 此秒内丢弃的消息数
  117. , dropped = 0 :: non_neg_integer()
  118. %% If true, flush notify messages from msg queue at overload
  119. %% 如果为true,则在过载时刷新来自消息队列的通知消息
  120. , flushQueue = true :: boolean()
  121. , flushThreshold = 0 :: integer()
  122. %% timer
  123. , timer = make_ref() :: reference()
  124. %% optional filter fun to avoid counting suppressed messages against HWM totals
  125. %% 可选的过滤器函数,以避免对HWM总数计算抑制消息
  126. , filter = fun(_) -> false end :: fun()
  127. }).
  128. -record(rumMsg, {
  129. destinations :: list(),
  130. metadata :: [tuple()],
  131. severity :: eRum:log_level(),
  132. datetime :: {string(), string()},
  133. timestamp :: erlang:timestamp(),
  134. message :: list()
  135. }).
  136. -type rumShaper() :: #rumShaper{}.