rewrite from lager
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

152 linhas
6.5 KiB

3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
1 ano atrás
3 anos atrás
1 ano atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
3 anos atrás
  1. -include("lgCom.hrl").
  2. %% 应用名字
  3. -define(LgAppName, eLog).
  4. %% 错误日志宏定义
  5. -define(ERR(Format), error_logger:error_msg(Format)).
  6. -define(ERR(Format, Args), error_logger:error_msg(Format, Args)).
  7. -define(Print(Args), io:format("IMY************~p~n", [Args])).
  8. %% 额外进程字典key
  9. -define(PdMdKey, pdLgMd).
  10. -define(LgTrackSink, '_trace_sink').
  11. %% 旋转日志超时时间
  12. -define(LgRotateTimeout, 100000).
  13. %% 部分默认配置值
  14. -define(LgDefTracer, lgDefTracer).
  15. -define(LgErrLogSink, errLoggerEvent).
  16. %% lgBkdConsole的选项
  17. -type lgConsoleOpt() ::
  18. {id, atom() | {atom(), atom()}} | %% 接收器 id
  19. {level, lgAtomLevel() | atom()} | %% 接收器 等级级别
  20. {use_stderr, boolean()} | %% 错误输出io
  21. {group_leader, false | pid() | atom()} | %% group_leader
  22. {fmtTer, atom()} | %% 日志格式化的模块名
  23. {fmtCfg, list()}. %% 日志格式化的格式
  24. %% lgBkdFile的选项
  25. -type lgFileOpt() ::
  26. {id, atom()} | %% 接收器 id
  27. {file, binary()} | %% base log file whole log name: logRoot ++ timeMin ++ "_" ++ this name
  28. {level, lgAtomLevel() | atom()} | %% 接收器 等级级别
  29. {size, non_neg_integer()} | %% 单个日志文件最大的字节数 为0则不旋转日志文件
  30. {date, string()} | %% 日志旋转的日期配置
  31. {count, non_neg_integer()} | %% 无用
  32. {rotator, atom()} | %% 日志旋转模块
  33. {hwm, non_neg_integer()} | %% 每一秒能能接收的日志数量 undefined 则不限制每秒接受的日志数量
  34. {flushQueue, boolean()} | %% 对于特定的接收器事件队列刷新,对于接收器 请使用改选项
  35. {flushThr, non_neg_integer()} | %% 如果flush_queue为true,则可以设置消息队列长度阈值,如果超过该阈值处将开始丢弃消息。默认阈值为0,这意味着如果flush_queue为true,则超过高水位标记时将丢弃消息,而不管消息队列的长度如何。:
  36. {syncInt, non_neg_integer()} | %% 日志文件同步间隔
  37. {syncSize, non_neg_integer()} | %% 日志文件同步大小
  38. {syncOn, lgAtomLevel()} | %% 日志文件立即同步的 日志登记级别
  39. {checkInt, non_neg_integer()} | %% 日志文件检查的时间间隔
  40. {fmtTer, atom()} | %% 日志格式化的模块
  41. {fmtCfg, term()}. %% 日志格式化的格式
  42. %% BkdFile选项默认值
  43. -define(LgDefLogLevel, info).
  44. -define(LgDefRotateSize, 10485760). %% 10mb
  45. -define(LgDefRotateDate, <<"$D0">>). %% midnight
  46. -define(LgDefRotateCnt, 5).
  47. -define(LgDefRotateMod, lgRotatorIns).
  48. -define(LgDefSyncLevel, error).
  49. -define(LgDefSyncInt, 1000). %% 单位毫秒
  50. -define(LgDefSyncSize, 1024 * 64). %% 64kb
  51. -define(LgDefCheckInt, 1000). %% 单位毫秒
  52. -define(LgDefCheckHwm, undefined).
  53. -define(LgDefFlushQueue, false).
  54. -define(LgDefFlushThr, 10).
  55. -define(LgDefFmtTer, lgFmtTer).
  56. -define(LgDefFormatterCfg, []).
  57. -define(LgDefLogRoot, <<"./log">>).
  58. %% 默认日志文件选项
  59. -define(LgDefHandler,
  60. [
  61. % {lgBkdConsole, [{level, '>=info'}]},
  62. {lgBkdFile, [{id, info}, {file, <<"info.log">>}, {level, '>= info'}, {size, 10485760}, {date, <<"$D0">>}]},
  63. {lgBkdFile, [{id, error}, {file, <<"error.log">>}, {level, '>= error'}, {size, 10485760}, {date, <<"$D0">>}]}
  64. ]).
  65. -record(lgShaper, {
  66. id :: any()
  67. %% 每秒我们尝试传递多少消息
  68. , hwm = undefined :: 'undefined' | pos_integer()
  69. %% 这秒内我们收到了多少条消息
  70. , mps = 0 :: non_neg_integer()
  71. %% 当前秒
  72. , lastTime = lgTime: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. , flushThr = 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 = undefined :: fun() %% fun(_) -> false end :: fun()
  84. }).
  85. -record(lgMsg, {
  86. severity :: lgNumLevel()
  87. , pid :: pid()
  88. , node :: node()
  89. , module :: module()
  90. , function :: atom()
  91. , line :: integer()
  92. , metadata :: [tuple()]
  93. , datetime :: binary()
  94. , timestamp :: non_neg_integer()
  95. , message :: list()
  96. , destinations :: list()
  97. }).
  98. -type lgShaper() :: #lgShaper{}.
  99. -type lgMsg() :: #lgMsg{}.
  100. -type lgAtomLevel() :: none | debug | info | notice | warning | error | critical | alert | emergency.
  101. -type lgNumLevel() :: 0 | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128.
  102. -type lgMaskLevel() :: 0..256.
  103. %% 日志等级列表
  104. -define(LgLevels, [debug, info, notice, warning, error, critical, alert, emergency, none]).
  105. -define(LgShouldLog(Sink, Level), ?eLogCfg:get(Sink) band Level =/= 0).
  106. -define(LgShouldLog(Level), ?eLogCfg:get(?LgDefSink) band Level =/= 0).
  107. -define(LgNotify(Level, Pid, Format, Args),
  108. gen_emm:info_notify(?LgDefSink, {mWriteLog, #lgMsg{severity = Level, pid = Pid, node = node(), module = ?MODULE, function = ?FUNCTION_NAME, line = ?LINE, metadata = [], datetime = lgUtil:msToBinStr(), timestamp = lgTime:nowMs(), message = eFmt:format(Format, Args), destinations = []}})).
  109. %%仅供内部使用仅内部非阻塞日志记录调用,当我们仍在启动大型啤酒时尝试进行日志记录(通常为错误)时,会有一些特殊处理。
  110. -define(INT_LOG(Level, Format, Args),
  111. Self = self(),
  112. %%在生成中执行此操作,这样就不会导致从gen_event处理程序调用gen_event:which_handlers的死锁
  113. spawn(
  114. fun() ->
  115. case catch (gen_emm:which_epm(?LgDefSink)) of
  116. X when X == []; X == {'EXIT', noproc}; X == [lgBkdThrottle] ->
  117. %% there's no handlers yet or eLog isn't running, try again
  118. %% in half a second.
  119. timer:sleep(500),
  120. ?LgNotify(Level, Self, Format, Args);
  121. _ ->
  122. case ?LgShouldLog(Level) of
  123. true ->
  124. ?LgNotify(Level, Self, Format, Args);
  125. _ ->
  126. ok
  127. end
  128. end
  129. end)).