|
|
@ -86,21 +86,21 @@ start() -> |
|
|
|
stop() -> |
|
|
|
application:stop(eRum). |
|
|
|
|
|
|
|
%% @doc Manually log a message into lager without using the parse transform. |
|
|
|
%% @doc Manually log a message into eRum without using the parse transform. |
|
|
|
-spec log(rumAtomLevel(), pid() | atom() | [tuple(), ...], list()) -> ok | {error, lager_not_running}. |
|
|
|
log(Level, Pid, Message) when is_pid(Pid); is_atom(Pid) -> |
|
|
|
dispatch_log(Level, [{pid, Pid}], Message, [], ?RumDefTruncation); |
|
|
|
log(Level, Metadata, Message) when is_list(Metadata) -> |
|
|
|
dispatch_log(Level, Metadata, Message, [], ?RumDefTruncation). |
|
|
|
|
|
|
|
%% @doc Manually log a message into lager without using the parse transform. |
|
|
|
%% @doc Manually log a message into eRum without using the parse transform. |
|
|
|
-spec log(rumAtomLevel(), pid() | atom() | [tuple(), ...], string(), list()) -> ok | {error, lager_not_running}. |
|
|
|
log(Level, Pid, Format, Args) when is_pid(Pid); is_atom(Pid) -> |
|
|
|
dispatch_log(Level, [{pid, Pid}], Format, Args, ?RumDefTruncation); |
|
|
|
log(Level, Metadata, Format, Args) when is_list(Metadata) -> |
|
|
|
dispatch_log(Level, Metadata, Format, Args, ?RumDefTruncation). |
|
|
|
|
|
|
|
%% @doc Manually log a message into lager without using the parse transform. |
|
|
|
%% @doc Manually log a message into eRum without using the parse transform. |
|
|
|
-spec log(atom(), rumAtomLevel(), pid() | atom() | [tuple(), ...], string(), list()) -> ok | {error, lager_not_running}. |
|
|
|
log(Sink, Level, Pid, Format, Args) when is_pid(Pid); is_atom(Pid) -> |
|
|
|
dispatch_log(Sink, Level, [{pid, Pid}], Format, Args, ?RumDefTruncation, safe); |
|
|
@ -110,14 +110,9 @@ log(Sink, Level, Metadata, Format, Args) when is_list(Metadata) -> |
|
|
|
log_unsafe(Level, Metadata, Format, Args) when is_list(Metadata) -> |
|
|
|
dispatch_log(?RumDefSink, Level, Metadata, Format, Args, ?RumDefTruncation, unsafe). |
|
|
|
|
|
|
|
%% backwards compatible with beams compiled with lager 2.x |
|
|
|
do_log(Severity, Metadata, Format, Args, Size, SeverityAsInt, LevelThreshold, TraceFilters, SinkPid) -> |
|
|
|
do_log(Severity, Metadata, Format, Args, Size, SeverityAsInt, |
|
|
|
LevelThreshold, TraceFilters, ?RumDefSink, SinkPid). |
|
|
|
|
|
|
|
-spec dispatch_log(atom(), rumAtomLevel(), list(), string(), list() | none, pos_integer(), safe | unsafe) -> ok | {error, lager_not_running} | {error, {sink_not_configured, atom()}}. |
|
|
|
%% this is the same check that the parse transform bakes into the module at compile time |
|
|
|
%% see lager_transform (lines 173-216) |
|
|
|
%% see rumTransform (lines 173-216) |
|
|
|
dispatch_log(Sink, Severity, Metadata, Format, Args, Size, Safety) when is_atom(Severity) -> |
|
|
|
SeverityAsInt = rumUtil:levelToNum(Severity), |
|
|
|
case {whereis(Sink), whereis(?RumDefSink), rumConfig:get({Sink, loglevel}, {?LOG_NONE, []})} of |
|
|
@ -130,6 +125,10 @@ dispatch_log(Sink, Severity, Metadata, Format, Args, Size, Safety) when is_atom( |
|
|
|
_ -> ok |
|
|
|
end. |
|
|
|
|
|
|
|
%% 向后兼容使用eRum 2.x编译的梁 |
|
|
|
do_log(Severity, Metadata, Format, Args, Size, SeverityAsInt, LevelThreshold, TraceFilters, SinkPid) -> |
|
|
|
do_log(Severity, Metadata, Format, Args, Size, SeverityAsInt, LevelThreshold, TraceFilters, ?RumDefSink, SinkPid). |
|
|
|
|
|
|
|
%% @private Should only be called externally from code generated from the parse transform |
|
|
|
do_log(Severity, Metadata, Format, Args, Size, SeverityAsInt, LevelThreshold, TraceFilters, Sink, SinkPid) when is_atom(Severity) -> |
|
|
|
FormatFun = fun() -> safe_format_chop(Format, Args, Size) end, |
|
|
@ -156,13 +155,13 @@ do_log_impl(Severity, Metadata, Format, Args, SeverityAsInt, LevelThreshold, Tra |
|
|
|
Severity, Metadata, Destinations), |
|
|
|
case rumConfig:get({Sink, async}, false) of |
|
|
|
true -> |
|
|
|
gen_event:notify(SinkPid, {mWriteLog, LagerMsg}); |
|
|
|
gen_emm:info_notify(SinkPid, {mWriteLog, LagerMsg}); |
|
|
|
false -> |
|
|
|
gen_event:sync_notify(SinkPid, {mWriteLog, LagerMsg}) |
|
|
|
gen_emm:call_notify(SinkPid, {mWriteLog, LagerMsg}) |
|
|
|
end, |
|
|
|
case TraceSinkPid /= undefined of |
|
|
|
true -> |
|
|
|
gen_event:notify(TraceSinkPid, {mWriteLog, LagerMsg}); |
|
|
|
gen_emm:info_notify(TraceSinkPid, {mWriteLog, LagerMsg}); |
|
|
|
false -> |
|
|
|
ok |
|
|
|
end; |
|
|
@ -234,10 +233,11 @@ setLogLevel(Handler, Ident, Level) when is_atom(Level) -> |
|
|
|
%% @doc Set the loglevel for a particular sink's backend that potentially has |
|
|
|
%% multiple identifiers. (Use `undefined' if it doesn't have any.) |
|
|
|
setLogLevel(Sink, Handler, Ident, Level) when is_atom(Level) -> |
|
|
|
HandlerArg = case Ident of |
|
|
|
undefined -> Handler; |
|
|
|
_ -> {Handler, Ident} |
|
|
|
end, |
|
|
|
HandlerArg = |
|
|
|
case Ident of |
|
|
|
undefined -> Handler; |
|
|
|
_ -> {Handler, Ident} |
|
|
|
end, |
|
|
|
Reply = gen_emm:call(Sink, HandlerArg, {mSetLogLevel, Level}, infinity), |
|
|
|
updateLogevelCfg(Sink), |
|
|
|
Reply. |
|
|
@ -268,21 +268,21 @@ setLogHwm(Handler, Hwm) when is_integer(Hwm) -> |
|
|
|
|
|
|
|
%% @doc Set the loghwm for a particular backend. |
|
|
|
setLogHwm(Sink, Handler, Hwm) when is_integer(Hwm) -> |
|
|
|
gen_event:call(Sink, Handler, {mSetLogHwm, Hwm}, infinity). |
|
|
|
gen_emm:call(Sink, Handler, {mSetLogHwm, Hwm}, infinity). |
|
|
|
|
|
|
|
%% @doc Set the loghwm (log high water mark) for file backends with multiple identifiers |
|
|
|
setLogHwm(Sink, Handler, Ident, Hwm) when is_integer(Hwm) -> |
|
|
|
gen_event:call(Sink, {Handler, Ident}, {mSetLogHwm, Hwm}, infinity). |
|
|
|
gen_emm:call(Sink, {Handler, Ident}, {mSetLogHwm, Hwm}, infinity). |
|
|
|
|
|
|
|
%% @doc Print stacktrace in human readable form |
|
|
|
pr_stacktrace(Stacktrace) -> |
|
|
|
Stacktrace1 = |
|
|
|
case application:get_env(lager, reverse_pretty_stacktrace, true) of |
|
|
|
true -> |
|
|
|
lists:reverse(Stacktrace); |
|
|
|
_ -> |
|
|
|
Stacktrace |
|
|
|
end, |
|
|
|
case rumUtil:get_env(reverse_pretty_stacktrace, true) of |
|
|
|
true -> |
|
|
|
lists:reverse(Stacktrace); |
|
|
|
_ -> |
|
|
|
Stacktrace |
|
|
|
end, |
|
|
|
pr_stacktrace_(Stacktrace1). |
|
|
|
|
|
|
|
pr_stacktrace_(Stacktrace) -> |
|
|
@ -295,7 +295,7 @@ pr_stacktrace_(Stacktrace) -> |
|
|
|
Stacktrace). |
|
|
|
|
|
|
|
pr_stacktrace(Stacktrace, {Class, Reason}) -> |
|
|
|
case application:get_env(lager, reverse_pretty_stacktrace, true) of |
|
|
|
case rumUtil:get_env(reverse_pretty_stacktrace, true) of |
|
|
|
true -> |
|
|
|
lists:flatten( |
|
|
|
pr_stacktrace_(lists:reverse(Stacktrace)) ++ "\n" ++ io_lib:format("~s:~p", [Class, Reason])); |
|
|
@ -344,7 +344,7 @@ trace_file(File, Filter, Options) when is_list(Options) -> |
|
|
|
|
|
|
|
trace_file(File, Filter, Level, Options) -> |
|
|
|
FileName = rumUtil:parsePath(File), |
|
|
|
case validate_trace_filters(Filter, Level, {lager_file_backend, FileName}) of |
|
|
|
case validate_trace_filters(Filter, Level, {rumBkdFile, FileName}) of |
|
|
|
{Sink, {ok, Trace}} -> |
|
|
|
Handlers = rumConfig:global_get(handlers, []), |
|
|
|
%% check if this file backend is already installed |
|
|
@ -359,7 +359,7 @@ trace_file(File, Filter, Level, Options) -> |
|
|
|
{file, FileName}), |
|
|
|
{level, none}), |
|
|
|
HandlerInfo = |
|
|
|
eRum_app:startHandler(Sink, {lager_file_backend, FileName}, LogFileConfig), |
|
|
|
eRum_app:startHandler(Sink, {rumBkdFile, FileName}, LogFileConfig), |
|
|
|
rumConfig:global_set(handlers, [HandlerInfo | Handlers]), |
|
|
|
{ok, installed}; |
|
|
|
{_Watcher, _Handler, Sink} -> |
|
|
@ -370,7 +370,7 @@ trace_file(File, Filter, Level, Options) -> |
|
|
|
case Res of |
|
|
|
{ok, _} -> |
|
|
|
add_trace_to_loglevel_config(Trace, Sink), |
|
|
|
{ok, {{lager_file_backend, FileName}, Filter, Level}}; |
|
|
|
{ok, {{rumBkdFile, FileName}, Filter, Level}}; |
|
|
|
{error, _} = E -> |
|
|
|
E |
|
|
|
end; |
|
|
@ -382,12 +382,12 @@ trace_console(Filter) -> |
|
|
|
trace_console(Filter, debug). |
|
|
|
|
|
|
|
trace_console(Filter, Level) -> |
|
|
|
trace(lager_console_backend, Filter, Level). |
|
|
|
trace(rumBkdConsole, Filter, Level). |
|
|
|
|
|
|
|
trace(Backend, Filter) -> |
|
|
|
trace(Backend, Filter, debug). |
|
|
|
|
|
|
|
trace({lager_file_backend, File}, Filter, Level) -> |
|
|
|
trace({rumBkdFile, File}, Filter, Level) -> |
|
|
|
trace_file(File, Filter, Level); |
|
|
|
|
|
|
|
trace(Backend, Filter, Level) -> |
|
|
@ -430,7 +430,7 @@ stop_trace_int({_Filter, _Level, Backend} = Trace, Sink) -> |
|
|
|
%% check no other traces point here |
|
|
|
case lists:keyfind(Backend, 3, NewTraces) of |
|
|
|
false -> |
|
|
|
gen_event:delete_handler(Sink, Backend, []), |
|
|
|
gen_emm:delEpm(Sink, Backend, []), |
|
|
|
rumConfig:global_set(handlers, |
|
|
|
lists:keydelete(Backend, 1, |
|
|
|
rumConfig:global_get(handlers))); |
|
|
@ -488,7 +488,7 @@ clear_all_traces() -> |
|
|
|
fun({Handler, _Watcher, Sink}) -> |
|
|
|
case getLogLevel(Sink, Handler) of |
|
|
|
none -> |
|
|
|
gen_event:delete_handler(Sink, Handler, []), |
|
|
|
gen_emm:delEpm(Sink, Handler, []), |
|
|
|
false; |
|
|
|
_ -> |
|
|
|
true |
|
|
@ -548,9 +548,9 @@ status() -> |
|
|
|
|
|
|
|
get_sink_handler_status(Sink, Handler, Level) -> |
|
|
|
case Handler of |
|
|
|
{lager_file_backend, File} -> |
|
|
|
{rumBkdFile, File} -> |
|
|
|
io_lib:format("File ~ts (~s) at level ~p\n", [File, Sink, Level]); |
|
|
|
lager_console_backend -> |
|
|
|
rumBkdConsole -> |
|
|
|
io_lib:format("Console (~s) at level ~p\n", [Sink, Level]); |
|
|
|
_ -> |
|
|
|
[] |
|
|
@ -693,7 +693,6 @@ is_record_known(Record, Module) -> |
|
|
|
end. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%% @private |
|
|
|
trace_func(#trace_func_state_v1{pid = Pid, level = Level, format_string = Fmt} = FuncState, Event, ProcState) -> |
|
|
|
_ = eRum:log(Level, Pid, Fmt, [Event, ProcState]), |
|
|
@ -739,7 +738,7 @@ get_sink_handler_status_unicode_test() -> |
|
|
|
validate_status(File). |
|
|
|
|
|
|
|
validate_status(File) -> |
|
|
|
Handler = {lager_file_backend, File}, |
|
|
|
Handler = {rumBkdFile, File}, |
|
|
|
Status = get_sink_handler_status(?RumDefSink, Handler, debug), |
|
|
|
?assertNotEqual(nomatch, string:find(Status, File)). |
|
|
|
-endif. |