%% 三元表达式 -define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)). %% 应用名字 -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{}.