rewrite from lager
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

139 rader
5.0 KiB

  1. -include("rumCom.hrl").
  2. -include("rumMsg.hrl").
  3. %% 应用名字
  4. -define(RumAppName, eRum).
  5. %% 三元表达式
  6. -define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)).
  7. %% 错误日志宏定义
  8. -define(ERR(Format), error_logger:error_msg(Format)).
  9. -define(ERR(Format, Args), error_logger:error_msg(Format, Args)).
  10. -define(Print(Args), io:format("IMY************~p~n", [Args])).
  11. %% 额外进程字典key
  12. -define(PdMdKey, pdRumMd).
  13. -define(RumTrackSink, '__trace_sink').
  14. %% 旋转日志超时时间
  15. -define(RumRotateTimeout, 100000).
  16. %% 部分默认配置值
  17. -define(RumDefTracer, rumDefTracer).
  18. -define(RumErrLogSink, errLoggerEvent).
  19. %% rumBkdConsole的选项
  20. -type rumConsoleOpt() ::
  21. {id, atom() | {atom(), atom()}} |
  22. {use_stderr, boolean()} |
  23. {group_leader, false | pid() | atom()} |
  24. {formatTer, atom()} |
  25. {formatCfg, 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. {hWM, non_neg_integer()} |
  35. %% 对于特定的接收器事件队列刷新,请使用改选项
  36. {flushQueue, boolean()} |
  37. %% 对于接收器 如果flush_queue为true,则可以设置消息队列长度阈值,在该阈值处将开始丢弃消息。默认阈值为0,
  38. %% 这意味着如果flush_queue为true,则超过高水位标记时将丢弃消息,而不管消息队列的长度如何。:
  39. {flushThr, non_neg_integer()} |
  40. {syncInt, non_neg_integer()} |
  41. {syncSize, non_neg_integer()} |
  42. {syncOn, rumAtomLevel()} |
  43. {checkInt, non_neg_integer()} |
  44. {formatTer, atom()} |
  45. {formatCfg, term()}.
  46. %% BkdFile选项默认值
  47. -define(RumDefLogLevel, info).
  48. -define(RumDefRotateSize, 10485760). %% 10mb
  49. -define(RumDefRotateDate, "$D0"). %% midnight
  50. -define(RumDefRotateCnt, 5).
  51. -define(RumDefRotateMod, rumRotatorIns).
  52. -define(RumDefSyncLevel, error).
  53. -define(RumDefSyncInt, 1000).
  54. -define(RumDefSyncSize, 1024 * 64). %% 64kb
  55. -define(RumDefCheckInt, 1000).
  56. -define(RumDefCheckHWM, 1000). %% IMY-todo修正该默认值
  57. -define(RumDefFlushQueue, true).
  58. -define(RumDefFlushThr, 0). %% IMY-todo修正该默认值
  59. -define(RumDefFormatTer, rumFormatTer).
  60. -define(RumDefFormatterCfg, []).
  61. %% 默认日志文件选项
  62. -define(RumDefHandler,
  63. [
  64. {rumBkdConsole, [{level, info}]},
  65. {rumBkdFile, [{file, <<"./log/error.log">>}, {level, '>=error'}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
  66. {rumBkdFile, [{file, <<"./log/console.log">>}, {level, '>=debug'}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
  67. ]).
  68. -record(rumShaper, {
  69. id :: any()
  70. %% 每秒我们尝试传递多少消息
  71. , hwm = undefined :: 'undefined' | pos_integer()
  72. %% 这秒内我们收到了多少条消息
  73. , mps = 0 :: non_neg_integer()
  74. %% 当前秒
  75. , lastTime = rumTime:now() :: erlang:timestamp()
  76. %% 此秒内丢弃的消息数
  77. , dropped = 0 :: non_neg_integer()
  78. %% If true, flush notify messages from msg queue at overload
  79. %% 如果为true,则在过载时刷新来自消息队列的通知消息
  80. , flushQueue = true :: boolean()
  81. , flushThr = 0 :: integer()
  82. %% timer
  83. , timer = make_ref() :: reference()
  84. %% optional filter fun to avoid counting suppressed messages against HWM totals
  85. %% 可选的过滤器函数,以避免对HWM总数计算抑制消息
  86. , filter = fun(_) -> false end :: fun()
  87. }).
  88. -type rumShaper() :: #rumShaper{}.
  89. -type rumAtomLevel() :: none | debug | info | notice | warning | error | critical | alert | emergency.
  90. -type rumMaskLevel() :: 0..256.
  91. %% 日志等级列表
  92. -define(RumLevels, [debug, info, notice, warning, error, critical, alert, emergency, none]).
  93. -define(RunShouldLog(Sink, Level), (rumUtil:levelToNum(Level) band ?eRumCfg:get(Sink)) /= 0).
  94. -define(RunShouldLog(Level), (rumUtil:levelToNum(Level) band rumConfig:get(?RumDefSink)) /= 0).
  95. -define(RunNotify(Level, Pid, Format, Args),
  96. LagerMsg = ?newMsg(Level, Pid, node(), ?MODULE, ?FUNCTION_NAME, ?LINE, [], [], rumUtil:nowMs(), eFmt:formatBin(Format, Args)),
  97. gen_emm:info_notify(?RumDefSink, {mWriteLog, LagerMsg})).
  98. %%仅供内部使用仅内部非阻塞日志记录调用,当我们仍在启动大型啤酒时尝试进行日志记录(通常为错误)时,会有一些特殊处理。
  99. -define(INT_LOG(Level, Format, Args),
  100. Self = self(),
  101. %%在生成中执行此操作,这样就不会导致从gen_event处理程序调用gen_event:which_handlers的死锁
  102. spawn(
  103. fun() ->
  104. case catch (gen_emm:which_epm(?RumDefSink)) of
  105. X when X == []; X == {'EXIT', noproc}; X == [rumBkdThrottle] ->
  106. %% there's no handlers yet or lager isn't running, try again
  107. %% in half a second.
  108. timer:sleep(500),
  109. ?RunNotify(Level, Self, Format, Args);
  110. _ ->
  111. case ?RunShouldLog(Level) of
  112. true ->
  113. ?RunNotify(Level, Self, Format, Args);
  114. _ ->
  115. ok
  116. end
  117. end
  118. end)).