|
|
- -define(RumDefTruncation, 4096).
- -define(RumDefTracer, lager_default_tracer).
- -define(RumDefSink, lager_event).
- -define(RumErrLogSink, error_logger_lager_event).
-
- -define(RumMetadata(Extras), [
- {severity, info},
- {pid, self()},
- {node, node()},
- {module, ?MODULE},
- {function, ?FUNCTION_NAME},
- {function_arity, ?FUNCTION_ARITY},
- {file, ?FILE},
- {line, ?LINE} | Extras
- ]).
-
-
- -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(RumLevelToNum(Level),
- case Level of
- debug -> ?DEBUG;
- info -> ?INFO;
- notice -> ?NOTICE;
- warning -> ?WARNING;
- error -> ?ERROR;
- critical -> ?CRITICAL;
- alert -> ?ALERT;
- emergency -> ?EMERGENCY
- end).
-
- -define(RumNumToLevel(Num),
- case Num of
- ?DEBUG -> debug;
- ?INFO -> info;
- ?NOTICE -> notice;
- ?WARNING -> warning;
- ?ERROR -> error;
- ?CRITICAL -> critical;
- ?ALERT -> alert;
- ?EMERGENCY -> emergency
- end).
-
- -define(RunShouldLog(Sink, Level), (rumUtil:level_to_num(Level) band element(1, rumConfig:get({Sink, loglevel}, {?LOG_NONE, []}))) /= 0).
-
- -define(RunShouldLog(Level), (rumUtil:level_to_num(Level) band element(1, rumConfig:get(loglevel, {?LOG_NONE, []}))) /= 0).
-
- -define(RunNotify(Level, Pid, Format, Args),
- gen_event:notify(lager_event, {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(lager_event)) 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 :: eRum:log_level(),
- datetime :: {string(), string()},
- timestamp :: erlang:timestamp(),
- message :: list()
- }).
-
- -type rumShaper() :: #rumShaper{}.
|