rewrite from lager
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

211 行
7.7 KiB

4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
4年前
  1. %% 三元表达式
  2. -define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)).
  3. %% 错误日志宏定义
  4. -define(ERR(Format), error_logger:error_msg(Format)).
  5. -define(ERR(Format, Args), error_logger:error_msg(Format, Args)).
  6. -define(Print(Args), io:format("IMY************~p~n", [Args])).
  7. -define(LAGER_MD_KEY, '__lager_metadata').
  8. -define(TRACE_SINK, '__trace_sink').
  9. -define(ROTATE_TIMEOUT, 100000).
  10. %% 应用名字
  11. -define(RumAppName, eRum).
  12. %% 部分默认配置值
  13. -define(RumDefTruncation, 4096).
  14. -define(RumDefTracer, lager_default_tracer).
  15. -define(RumDefSink, rumEvent).
  16. -define(RumErrLogSink, error_logger_lager_event).
  17. -type rumConsoleOpt() ::
  18. {id, atom() | {atom(), atom()}} |
  19. {use_stderr, boolean()} |
  20. {group_leader, false | pid() | atom()} |
  21. {formatter, atom()} |
  22. {formatter_config, list()}.
  23. -type rumFileOpt() ::
  24. {file, string()} |
  25. {level, rumAtomLevel()} |
  26. {size, non_neg_integer()} |
  27. {date, string()} |
  28. {count, non_neg_integer()} |
  29. {rotator, atom()} |
  30. {high_water_mark, non_neg_integer()} |
  31. {flush_queue, boolean()} |
  32. {flush_threshold, non_neg_integer()} |
  33. {sync_interval, non_neg_integer()} |
  34. {sync_size, non_neg_integer()} |
  35. {sync_on, rumAtomLevel()} |
  36. {check_interval, non_neg_integer()} |
  37. {formatter, atom()} |
  38. {formatter_config, term()}.
  39. %% BkdFile默认配置
  40. -define(RumDefLogLevel, info).
  41. -define(RumDefRotateSize, 10485760). %% 10mb
  42. -define(RumDefRotateDate, "$D0"). %% midnight
  43. -define(RumDefRotateCnt, 5).
  44. -define(RumDefRotateMod, rumRotatorIns).
  45. -define(RumDefSyncLevel, error).
  46. -define(RumDefSyncInterval, 1000).
  47. -define(RumDefSyncSize, 1024 * 64). %% 64kb
  48. -define(RumDefCheckInterval, 1000).
  49. -define(RumDefCheckHWM, 0). %% IMY-todo修正该默认值
  50. -define(RumDefFlushQueue, true).
  51. -define(RumDefFlushThreshold, 0). %% IMY-todo修正该默认值
  52. -define(RumDefFormatter, rumFormatter).
  53. -define(RumDefFormatterCfg, []).
  54. %% 进程字典Key
  55. %% 默认日志文件选项
  56. -define(RumDefHandler,
  57. [
  58. {rumBkdConsole, [{level, info}]},
  59. {rumBkdFile, [{file, "error.log"}, {level, error}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
  60. {rumBkdFile, [{file, "console.log"}, {level, info}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
  61. ]).
  62. %% 获取元数据的宏定义
  63. -define(RumMetadata(Extras), [
  64. {severity, info},
  65. {pid, self()},
  66. {node, node()},
  67. {module, ?MODULE},
  68. {function, ?FUNCTION_NAME},
  69. {function_arity, ?FUNCTION_ARITY},
  70. {file, ?FILE},
  71. {line, ?LINE} | Extras
  72. ]).
  73. -type rumAtomLevel() :: none | debug | info | notice | warning | error | critical | alert | emergency.
  74. -type rumMaskLevel() :: 0..256.
  75. %% 日志等级列表
  76. -define(RumLevels, [debug, info, notice, warning, error, critical, alert, emergency, none]).
  77. %% 使用这些“功能”意味着,出于安全考虑,参数列表不会被截断
  78. -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}]).
  79. %% 日志等级定义
  80. -define(DEBUG, 128).
  81. -define(INFO, 64).
  82. -define(NOTICE, 32).
  83. -define(WARNING, 16).
  84. -define(ERROR, 8).
  85. -define(CRITICAL, 4).
  86. -define(ALERT, 2).
  87. -define(EMERGENCY, 1).
  88. -define(LOG_NONE, 0).
  89. -define(RunShouldLog(Sink, Level), (rumUtil:levelToNum(Level) band element(1, rumConfig:get({Sink, loglevel}, {?LOG_NONE, []}))) /= 0).
  90. -define(RunShouldLog(Level), (rumUtil:levelToNum(Level) band element(1, rumConfig:get(loglevel, {?LOG_NONE, []}))) /= 0).
  91. -define(RunNotify(Level, Pid, Format, Args),
  92. gen_event:notify(rumEvent, {mWriteLog, rumMsg:new(io_lib:format(Format, Args), Level, [{pid, Pid}, {line, ?LINE}, {file, ?FILE}, {module, ?MODULE}], [])})).
  93. %%仅供内部使用仅内部非阻塞日志记录调用,当我们仍在启动大型啤酒时尝试进行日志记录(通常为错误)时,会有一些特殊处理。
  94. -ifdef(TEST).
  95. -define(INT_LOG(Level, Format, Args),
  96. case ?RunShouldLog(Level) of
  97. true ->
  98. ?RunNotify(Level, self(), Format, Args);
  99. _ ->
  100. ok
  101. end).
  102. -else.
  103. -define(INT_LOG(Level, Format, Args),
  104. Self = self(),
  105. %% do this in a spawn so we don't cause a deadlock calling gen_event:which_handlers
  106. %% from a gen_event handler
  107. spawn(fun() ->
  108. case catch (gen_event:which_handlers(rumEvent)) of
  109. X when X == []; X == {'EXIT', noproc}; X == [rumBkdThrottle] ->
  110. %% there's no handlers yet or lager isn't running, try again
  111. %% in half a second.
  112. timer:sleep(500),
  113. ?RunNotify(Level, Self, Format, Args);
  114. _ ->
  115. case ?RunShouldLog(Level) of
  116. true ->
  117. ?RunNotify(Level, Self, Format, Args);
  118. _ ->
  119. ok
  120. end
  121. end
  122. end)).
  123. -endif.
  124. -define(rumLog(Severity, Format, Args, Safety),
  125. ?rumLog(?RumDefSink, Severity, ?RumMetadata(eRum:md()), Format, Args, ?RumDefTruncation, Safety)).
  126. -define(rumLog(Severity, Metadata, Format, Args, Safety),
  127. ?rumLog(?RumDefSink, Severity, ?RumMetadata(Metadata ++ eRum:md()), Format, Args, ?RumDefTruncation, Safety)).
  128. -define(rumLog(Sink, Severity, Metadata, Format, Args, Size, Safety),
  129. _ = eRum:dispatch_log(Sink, Severity, Metadata, Format, Args, Size, Safety)).
  130. -define(rumDebug(Format, Args), ?rumLog(debug, Format, Args, safe)).
  131. -define(rumDebug(Metadata, Format, Args), ?rumLog(debug, Metadata, Format, Args, safe)).
  132. -define(rumInfo(Format, Args), ?rumLog(info, Format, Args, safe)).
  133. -define(rumInfo(Metadata, Format, Args), ?rumLog(info, Metadata, Format, Args, safe)).
  134. -define(rumNotice(Format, Args), ?rumLog(notice, Format, Args, safe)).
  135. -define(rumNotice(Metadata, Format, Args), ?rumLog(notice, Metadata, Format, Args, safe)).
  136. -define(rumWarning(Format, Args), ?rumLog(warning, Format, Args, safe)).
  137. -define(rumWarning(Metadata, Format, Args), ?rumLog(warning, Metadata, Format, Args, safe)).
  138. -define(rumError(Format, Args), ?rumLog(error, Format, Args, safe)).
  139. -define(rumError(Metadata, Format, Args), ?rumLog(error, Metadata, Format, Args, safe)).
  140. -define(rumCritical(Format, Args), ?rumLog(critical, Format, Args, safe)).
  141. -define(rumCritical(Metadata, Format, Args), ?rumLog(critical, Metadata, Format, Args, safe)).
  142. -define(rumAlert(Format, Args), ?rumLog(alert, Format, Args, safe)).
  143. -define(rumAlert(Metadata, Format, Args), ?rumLog(alert, Metadata, Format, Args, safe)).
  144. -define(rumEmergency(Format, Args), ?rumLog(emergency, Format, Args, safe)).
  145. -define(rumEmergency(Metadata, Format, Args), ?rumLog(emergency, Metadata, Format, Args, safe)).
  146. -define(rumNone(Format, Args), ?rumLog(none, Format, Args, safe)).
  147. -define(rumNone(Metadata, Format, Args), ?rumLog(none, Metadata, Format, Args, safe)).
  148. -record(rumShaper, {
  149. id :: any()
  150. %% 每秒我们尝试传递多少消息
  151. , hwm = undefined :: 'undefined' | pos_integer()
  152. %% 这秒内我们收到了多少条消息
  153. , mps = 0 :: non_neg_integer()
  154. %% 当前秒
  155. , lastTime = rumTime:now() :: erlang:timestamp()
  156. %% 此秒内丢弃的消息数
  157. , dropped = 0 :: non_neg_integer()
  158. %% If true, flush notify messages from msg queue at overload
  159. %% 如果为true,则在过载时刷新来自消息队列的通知消息
  160. , flushQueue = true :: boolean()
  161. , flushThreshold = 0 :: integer()
  162. %% timer
  163. , timer = make_ref() :: reference()
  164. %% optional filter fun to avoid counting suppressed messages against HWM totals
  165. %% 可选的过滤器函数,以避免对HWM总数计算抑制消息
  166. , filter = fun(_) -> false end :: fun()
  167. }).
  168. -record(rumMsg, {
  169. destinations :: list(),
  170. metadata :: [tuple()],
  171. severity :: rumAtomLevel(),
  172. datetime :: binary(),
  173. timestamp :: non_neg_integer(),
  174. message :: list()
  175. }).
  176. -type rumShaper() :: #rumShaper{}.