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.

168 line
5.7 KiB

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