rewrite from lager
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

162 строки
6.1 KiB

%% 应用名字
-define(RumAppName, eRum).
%% 部分默认配置值
-define(RumDefTruncation, 4096).
-define(RumDefTracer, lager_default_tracer).
-define(RumDefSink, rumEvent).
-define(RumErrLogSink, error_logger_lager_event).
%% 进程字典Key
-define(RumPdLogNames, rumPdLogNames).
-define(RumBackendThrottle, rumBackendThrottle).
%% 默认日志文件选项
-define(DEFAULT_HANDLER_CONF,
[
{lager_console_backend, [{level, info}]},
{lager_file_backend, [{file, "error.log"}, {level, error}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
{lager_file_backend, [{file, "console.log"}, {level, info}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
]).
%% 获取元数据的宏定义
-define(RumMetadata(Extras), [
{severity, info},
{pid, self()},
{node, node()},
{module, ?MODULE},
{function, ?FUNCTION_NAME},
{function_arity, ?FUNCTION_ARITY},
{file, ?FILE},
{line, ?LINE} | Extras
]).
-type rumLevel() :: none | debug | info | notice | warning | error | critical | alert | emergency.
-type rumLevelNum() :: 0..256.
%% 日志等级列表
-define(RumLevels, [debug, info, notice, warning, error, critical, alert, emergency, none]).
%% 使用这些“功能”意味着,出于安全考虑,参数列表不会被截断
-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}]).
%% 日志等级定义
-define(DEBUG, 128).
-define(INFO, 64).
-define(NOTICE, 32).
-define(WARNING, 16).
-define(ERROR, 8).
-define(CRITICAL, 4).
-define(ALERT, 2).
-define(EMERGENCY, 1).
-define(LOG_NONE, 0).
-define(RunShouldLog(Sink, Level), (rumUtil:levelToNum(Level) band element(1, rumConfig:get({Sink, loglevel}, {?LOG_NONE, []}))) /= 0).
-define(RunShouldLog(Level), (rumUtil:levelToNum(Level) band element(1, rumConfig:get(loglevel, {?LOG_NONE, []}))) /= 0).
-define(RunNotify(Level, Pid, Format, Args),
gen_event:notify(rumEvent, {log, rumMsg:new(io_lib:format(Format, Args), Level, [{pid, Pid}, {line, ?LINE}, {file, ?FILE}, {module, ?MODULE}], [])})).
%%仅供内部使用仅内部非阻塞日志记录调用,当我们仍在启动大型啤酒时尝试进行日志记录(通常为错误)时,会有一些特殊处理。
-ifdef(TEST).
-define(INT_LOG(Level, Format, Args),
case ?RunShouldLog(Level) of
true ->
?RunNotify(Level, self(), Format, Args);
_ ->
ok
end).
-else.
-define(INT_LOG(Level, Format, Args),
Self = self(),
%% do this in a spawn so we don't cause a deadlock calling gen_event:which_handlers
%% from a gen_event handler
spawn(fun() ->
case catch (gen_event:which_handlers(rumEvent)) of
X when X == []; X == {'EXIT', noproc}; X == [lager_backend_throttle] ->
%% there's no handlers yet or lager isn't running, try again
%% in half a second.
timer:sleep(500),
?RunNotify(Level, Self, Format, Args);
_ ->
case ?RunShouldLog(Level) of
true ->
?RunNotify(Level, Self, Format, Args);
_ ->
ok
end
end
end)).
-endif.
-define(rumLog(Severity, Format, Args, Safety),
?rumLog(?RumDefSink, Severity, ?RumMetadata(eRum:md()), Format, Args, ?RumDefTruncation, Safety)).
-define(rumLog(Severity, Metadata, Format, Args, Safety),
?rumLog(?RumDefSink, Severity, ?RumMetadata(Metadata ++ eRum:md()), Format, Args, ?RumDefTruncation, Safety)).
-define(rumLog(Sink, Severity, Metadata, Format, Args, Size, Safety),
_ = eRum:dispatch_log(Sink, Severity, Metadata, Format, Args, Size, Safety)).
-define(rumDebug(Format, Args), ?rumLog(debug, Format, Args, safe)).
-define(rumDebug(Metadata, Format, Args), ?rumLog(debug, Metadata, Format, Args, safe)).
-define(rumInfo(Format, Args), ?rumLog(info, Format, Args, safe)).
-define(rumInfo(Metadata, Format, Args), ?rumLog(info, Metadata, Format, Args, safe)).
-define(rumNotice(Format, Args), ?rumLog(notice, Format, Args, safe)).
-define(rumNotice(Metadata, Format, Args), ?rumLog(notice, Metadata, Format, Args, safe)).
-define(rumWarning(Format, Args), ?rumLog(warning, Format, Args, safe)).
-define(rumWarning(Metadata, Format, Args), ?rumLog(warning, Metadata, Format, Args, safe)).
-define(rumError(Format, Args), ?rumLog(error, Format, Args, safe)).
-define(rumError(Metadata, Format, Args), ?rumLog(error, Metadata, Format, Args, safe)).
-define(rumCritical(Format, Args), ?rumLog(critical, Format, Args, safe)).
-define(rumCritical(Metadata, Format, Args), ?rumLog(critical, Metadata, Format, Args, safe)).
-define(rumAlert(Format, Args), ?rumLog(alert, Format, Args, safe)).
-define(rumAlert(Metadata, Format, Args), ?rumLog(alert, Metadata, Format, Args, safe)).
-define(rumEmergency(Format, Args), ?rumLog(emergency, Format, Args, safe)).
-define(rumEmergency(Metadata, Format, Args), ?rumLog(emergency, Metadata, Format, Args, safe)).
-define(rumNone(Format, Args), ?rumLog(none, Format, Args, safe)).
-define(rumNone(Metadata, Format, Args), ?rumLog(none, Metadata, Format, Args, safe)).
-record(rumShaper, {
id :: any()
%% 每秒我们尝试传递多少消息
, hwm = undefined :: 'undefined' | pos_integer()
%% 这秒内我们收到了多少条消息
, mps = 0 :: non_neg_integer()
%% 当前秒
, lastTime = os:timestamp() :: erlang:timestamp()
%% 此秒内丢弃的消息数
, dropped = 0 :: non_neg_integer()
%% If true, flush notify messages from msg queue at overload
%% 如果为true,则在过载时刷新来自消息队列的通知消息
, flushQueue = true :: boolean()
, flushThreshold = 0 :: integer()
%% timer
, timer = make_ref() :: reference()
%% optional filter fun to avoid counting suppressed messages against HWM totals
%% 可选的过滤器函数,以避免对HWM总数计算抑制消息
, filter = fun(_) -> false end :: fun()
}).
-record(rumMsg, {
destinations :: list(),
metadata :: [tuple()],
severity :: rumLevel(),
datetime :: binary(),
timestamp :: non_neg_integer(),
message :: list()
}).
-type rumShaper() :: #rumShaper{}.