Sfoglia il codice sorgente

ft: 删除transform 不支持transform 因为影响编译速度

master
SisMaker 4 anni fa
parent
commit
419316570c
22 ha cambiato i file con 186 aggiunte e 498 eliminazioni
  1. +0
    -167
      include/eRum.hrl
  2. +168
    -0
      include/rumDef.hrl
  3. +0
    -0
      include/rumTime.hrl
  4. +1
    -1
      src/backend/rumBkdConsole.erl
  5. +1
    -1
      src/backend/rumBkdFile.erl
  6. +1
    -1
      src/backend/rumBkdThrottle.erl
  7. +1
    -1
      src/crashLog/rumCrashLog.erl
  8. +1
    -1
      src/eRum.erl
  9. +1
    -1
      src/eRum_app.erl
  10. +1
    -1
      src/eRum_sup.erl
  11. +1
    -1
      src/errLogger/rumErrLoggerH.erl
  12. +1
    -1
      src/formatter/rumFormatter.erl
  13. +1
    -1
      src/mgrKiller/rumMgrKiller.erl
  14. +1
    -1
      src/test/lager_common_test_backend.erl
  15. +0
    -313
      src/transform/rumTransform.erl
  16. +1
    -1
      src/utils/rumConfig.erl
  17. +1
    -1
      src/utils/rumMsg.erl
  18. +1
    -1
      src/utils/rumUtil.erl
  19. +1
    -1
      src/watcher/rumHWatcherSrv.erl
  20. +1
    -1
      test/lager_crash_backend.erl
  21. +1
    -1
      test/lager_slow_backend.erl
  22. +1
    -1
      test/lager_test_function_transform.erl

+ 0
- 167
include/eRum.hrl Vedi File

@ -1,78 +1,3 @@
%%
-define(RumAppName, eRum).
%%
-define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)).
%%
-define(ERR(Format), error_logger:error_msg(Format)).
-define(ERR(Format, Args), error_logger:error_msg(Format, Args)).
-define(Print(Args), io:format("IMY************~p~n", [Args])).
%% key
-define(PdMdKey, pdRumMd).
-define(RumTrackSink, '__trace_sink').
%%
-define(ROTATE_TIMEOUT, 100000).
%%
-define(RumDefTruncation, 4096).
-define(RumDefTracer, lager_default_tracer).
-define(RumDefSink, rumEvent).
-define(RumErrLogSink, error_logger_lager_event).
%% rumBkdConsole的选项
-type rumConsoleOpt() ::
{id, atom() | {atom(), atom()}} |
{use_stderr, boolean()} |
{group_leader, false | pid() | atom()} |
{formatter, atom()} |
{formatter_config, list()}.
%% rumBkdFile的选项
-type rumFileOpt() ::
{file, binary()} |
{level, rumAtomLevel() | atom()} |
{size, non_neg_integer()} |
{date, string()} |
{count, non_neg_integer()} |
{rotator, atom()} |
{high_water_mark, non_neg_integer()} |
{flush_queue, boolean()} |
{flush_threshold, non_neg_integer()} |
{sync_interval, non_neg_integer()} |
{sync_size, non_neg_integer()} |
{sync_on, rumAtomLevel()} |
{check_interval, non_neg_integer()} |
{formatter, atom()} |
{formatter_config, term()}.
%% BkdFile选项默认值
-define(RumDefLogLevel, info).
-define(RumDefRotateSize, 10485760). %% 10mb
-define(RumDefRotateDate, "$D0"). %% midnight
-define(RumDefRotateCnt, 5).
-define(RumDefRotateMod, rumRotatorIns).
-define(RumDefSyncLevel, error).
-define(RumDefSyncInterval, 1000).
-define(RumDefSyncSize, 1024 * 64). %% 64kb
-define(RumDefCheckInterval, 1000).
-define(RumDefCheckHWM, 1000). %% IMY-todo修正该默认值
-define(RumDefFlushQueue, true).
-define(RumDefFlushThreshold, 0). %% IMY-todo修正该默认值
-define(RumDefFormatter, rumFormatter).
-define(RumDefFormatterCfg, []).
%%
-define(RumDefHandler,
[
{rumBkdConsole, [{level, info}]},
{rumBkdFile, [{file, <<"./log/error.log">>}, {level, '>=error'}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
{rumBkdFile, [{file, <<"./log/console.log">>}, {level, '>=debug'}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
]).
%%
-define(RumMetadata(Extras), [
{severity, info},
@ -85,97 +10,6 @@
{line, ?LINE} | Extras
]).
-record(rumShaper, {
id :: any()
%%
, hwm = undefined :: 'undefined' | pos_integer()
%%
, mps = 0 :: non_neg_integer()
%%
, lastTime = rumTime:now() :: 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 :: rumAtomLevel(),
datetime :: binary(),
timestamp :: non_neg_integer(),
message :: list()
}).
-type rumShaper() :: #rumShaper{}.
-type rumAtomLevel() :: none | debug | info | notice | warning | error | critical | alert | emergency.
-type rumMaskLevel() :: 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_emm:info_notify(rumEvent, {mWriteLog, 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(),
%%gen_event处理程序调用gen_eventwhich_handlers的死锁
spawn(fun() ->
case catch (gen_event:which_handlers(rumEvent)) of
X when X == []; X == {'EXIT', noproc}; X == [rumBkdThrottle] ->
%% 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)).
@ -211,4 +45,3 @@
-define(rumNone(Format, Args), ?rumLog(none, Format, Args, safe)).
-define(rumNone(Metadata, Format, Args), ?rumLog(none, Metadata, Format, Args, safe)).

+ 168
- 0
include/rumDef.hrl Vedi File

@ -0,0 +1,168 @@
%%
-define(RumAppName, eRum).
%%
-define(IIF(Cond, Ret1, Ret2), (case Cond of true -> Ret1; _ -> Ret2 end)).
%%
-define(ERR(Format), error_logger:error_msg(Format)).
-define(ERR(Format, Args), error_logger:error_msg(Format, Args)).
-define(Print(Args), io:format("IMY************~p~n", [Args])).
%% key
-define(PdMdKey, pdRumMd).
-define(RumTrackSink, '__trace_sink').
%%
-define(ROTATE_TIMEOUT, 100000).
%%
-define(RumDefTruncation, 4096).
-define(RumDefTracer, lager_default_tracer).
-define(RumDefSink, rumEvent).
-define(RumErrLogSink, error_logger_lager_event).
%% rumBkdConsole的选项
-type rumConsoleOpt() ::
{id, atom() | {atom(), atom()}} |
{use_stderr, boolean()} |
{group_leader, false | pid() | atom()} |
{formatter, atom()} |
{formatter_config, list()}.
%% rumBkdFile的选项
-type rumFileOpt() ::
{file, binary()} |
{level, rumAtomLevel() | atom()} |
{size, non_neg_integer()} |
{date, string()} |
{count, non_neg_integer()} |
{rotator, atom()} |
{high_water_mark, non_neg_integer()} |
{flush_queue, boolean()} |
{flush_threshold, non_neg_integer()} |
{sync_interval, non_neg_integer()} |
{sync_size, non_neg_integer()} |
{sync_on, rumAtomLevel()} |
{check_interval, non_neg_integer()} |
{formatter, atom()} |
{formatter_config, term()}.
%% BkdFile选项默认值
-define(RumDefLogLevel, info).
-define(RumDefRotateSize, 10485760). %% 10mb
-define(RumDefRotateDate, "$D0"). %% midnight
-define(RumDefRotateCnt, 5).
-define(RumDefRotateMod, rumRotatorIns).
-define(RumDefSyncLevel, error).
-define(RumDefSyncInterval, 1000).
-define(RumDefSyncSize, 1024 * 64). %% 64kb
-define(RumDefCheckInterval, 1000).
-define(RumDefCheckHWM, 1000). %% IMY-todo修正该默认值
-define(RumDefFlushQueue, true).
-define(RumDefFlushThreshold, 0). %% IMY-todo修正该默认值
-define(RumDefFormatter, rumFormatter).
-define(RumDefFormatterCfg, []).
%%
-define(RumDefHandler,
[
{rumBkdConsole, [{level, info}]},
{rumBkdFile, [{file, <<"./log/error.log">>}, {level, '>=error'}, {size, 10485760}, {date, "$D0"}, {count, 5}]},
{rumBkdFile, [{file, <<"./log/console.log">>}, {level, '>=debug'}, {size, 10485760}, {date, "$D0"}, {count, 5}]}
]).
-record(rumShaper, {
id :: any()
%%
, hwm = undefined :: 'undefined' | pos_integer()
%%
, mps = 0 :: non_neg_integer()
%%
, lastTime = rumTime:now() :: 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 :: rumAtomLevel(),
datetime :: binary(),
timestamp :: non_neg_integer(),
message :: list()
}).
-type rumShaper() :: #rumShaper{}.
-type rumAtomLevel() :: none | debug | info | notice | warning | error | critical | alert | emergency.
-type rumMaskLevel() :: 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_emm:info_notify(rumEvent, {mWriteLog, 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(),
%%gen_event处理程序调用gen_eventwhich_handlers的死锁
spawn(fun() ->
case catch (gen_event:which_handlers(rumEvent)) of
X when X == []; X == {'EXIT', noproc}; X == [rumBkdThrottle] ->
%% 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.

src/utils/rumTime.hrl → include/rumTime.hrl Vedi File


+ 1
- 1
src/backend/rumBkdConsole.erl Vedi File

@ -7,7 +7,7 @@
-behaviour(gen_emm).
-include("eRum.hrl").
-include("rumDef.hrl").
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

+ 1
- 1
src/backend/rumBkdFile.erl Vedi File

@ -9,7 +9,7 @@
%% For performance, the file backend does delayed writes, although it will sync at specific log levels, configured via the `sync_on' option.
%% By default the error level or above will trigger a sync.
-include("eRum.hrl").
-include("rumDef.hrl").
-include_lib("kernel/include/file.hrl").
-behaviour(gen_emm).

+ 1
- 1
src/backend/rumBkdThrottle.erl Vedi File

@ -6,7 +6,7 @@
-behaviour(gen_emm).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([
init/1

+ 1
- 1
src/crashLog/rumCrashLog.erl Vedi File

@ -9,7 +9,7 @@
-behaviour(gen_srv).
-include("eRum.hrl").
-include("rumDef.hrl").
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

+ 1
- 1
src/eRum.erl Vedi File

@ -1,6 +1,6 @@
-module(eRum).
-include("eRum.hrl").
-include("rumDef.hrl").
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

+ 1
- 1
src/eRum_app.erl Vedi File

@ -2,7 +2,7 @@
-behaviour(application).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([
start/2

+ 1
- 1
src/eRum_sup.erl Vedi File

@ -2,7 +2,7 @@
-behaviour(supervisor).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([
start_link/0

+ 1
- 1
src/errLogger/rumErrLoggerH.erl Vedi File

@ -3,7 +3,7 @@
%% error_logger后端eRum
%% @see rumCrashLog
-include("eRum.hrl").
-include("rumDef.hrl").
-behaviour(gen_event).

+ 1
- 1
src/formatter/rumFormatter.erl Vedi File

@ -1,6 +1,6 @@
-module(rumFormatter).
-include("eRum.hrl").
-include("rumDef.hrl").
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

+ 1
- 1
src/mgrKiller/rumMgrKiller.erl Vedi File

@ -2,7 +2,7 @@
-behavior(gen_emm).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([kill_me/0]).

+ 1
- 1
src/test/lager_common_test_backend.erl Vedi File

@ -20,7 +20,7 @@
format_config :: any(),
mWriteLog = [] :: list()}).
-include("eRum.hrl").
-include("rumDef.hrl").
-define(TERSE_FORMAT, [time, " ", color, "[", severity, "] ", message]).
%% @doc Before every test, just

+ 0
- 313
src/transform/rumTransform.erl Vedi File

@ -1,313 +0,0 @@
-module(rumTransform).
-include("eRum.hrl").
-export([parse_transform/2]).
%% @private
parse_transform(AST, Options) ->
TruncSize = proplists:get_value(lager_truncation_size, Options, ?RumDefTruncation),
Enable = proplists:get_value(lager_print_records_flag, Options, true),
Sinks = [lager] ++ proplists:get_value(lager_extra_sinks, Options, []),
Functions = proplists:get_value(lager_function_transforms, Options, []),
put(print_records_flag, Enable),
put(truncation_size, TruncSize),
put(sinks, Sinks),
put(functions, lists:keysort(1, Functions)),
erlang:put(records, []),
%% .app file should either be in the outdir, or the same dir as the source file
guess_application(proplists:get_value(outdir, Options), hd(AST)),
walk_ast([], AST).
walk_ast(Acc, []) ->
case get(print_records_flag) of
true ->
insert_record_attribute(Acc);
false ->
lists:reverse(Acc)
end;
walk_ast(Acc, [{attribute, _, module, {Module, _PmodArgs}} = H | T]) ->
%% A wild parameterized module appears!
put(module, Module),
walk_ast([H | Acc], T);
walk_ast(Acc, [{attribute, _, module, Module} = H | T]) ->
put(module, Module),
walk_ast([H | Acc], T);
walk_ast(Acc, [{attribute, _, lager_function_transforms, FromModule} = H | T]) ->
%% Merge transform options from the module over the compile options
FromOptions = get(functions),
put(functions, orddict:merge(fun(_Key, _V1, V2) -> V2 end, FromOptions, lists:keysort(1, FromModule))),
walk_ast([H | Acc], T);
walk_ast(Acc, [{function, Line, Name, Arity, Clauses} | T]) ->
put(function, Name),
walk_ast([{function, Line, Name, Arity,
walk_clauses([], Clauses)} | Acc], T);
walk_ast(Acc, [{attribute, _, record, {Name, Fields}} = H | T]) ->
FieldNames = lists:map(fun record_field_name/1, Fields),
stash_record({Name, FieldNames}),
walk_ast([H | Acc], T);
walk_ast(Acc, [H | T]) ->
walk_ast([H | Acc], T).
record_field_name({record_field, _, {atom, _, FieldName}}) ->
FieldName;
record_field_name({record_field, _, {atom, _, FieldName}, _Default}) ->
FieldName;
record_field_name({typed_record_field, Field, _Type}) ->
record_field_name(Field).
walk_clauses(Acc, []) ->
lists:reverse(Acc);
walk_clauses(Acc, [{clause, Line, Arguments, Guards, Body} | T]) ->
walk_clauses([{clause, Line, Arguments, Guards, walk_body([], Body)} | Acc], T).
walk_body(Acc, []) ->
lists:reverse(Acc);
walk_body(Acc, [H | T]) ->
walk_body([transform_statement(H, get(sinks)) | Acc], T).
transform_statement({call, Line, {remote, _Line1, {atom, _Line2, Module}, {atom, _Line3, Function}}, Arguments0} = Stmt, Sinks) ->
case lists:member(Module, Sinks) of
true ->
case lists:member(Function, ?RumLevels) of
true ->
SinkName = rumUtil:makeInnerSinkName(Module),
do_transform(Line, SinkName, Function, Arguments0);
false ->
case lists:keyfind(Function, 1, ?RumLevelsUnsafe) of
{Function, Severity} ->
SinkName = rumUtil:makeInnerSinkName(Module),
do_transform(Line, SinkName, Severity, Arguments0, unsafe);
false ->
Stmt
end
end;
false ->
list_to_tuple(transform_statement(tuple_to_list(Stmt), Sinks))
end;
transform_statement(Stmt, Sinks) when is_tuple(Stmt) ->
list_to_tuple(transform_statement(tuple_to_list(Stmt), Sinks));
transform_statement(Stmt, Sinks) when is_list(Stmt) ->
[transform_statement(S, Sinks) || S <- Stmt];
transform_statement(Stmt, _Sinks) ->
Stmt.
add_function_transforms(_Line, DefaultAttrs, []) ->
DefaultAttrs;
add_function_transforms(Line, DefaultAttrs, [{Atom, on_emit, {Module, Function}} | Remainder]) ->
NewFunction = {tuple, Line, [
{atom, Line, Atom},
{'fun', Line, {
function, {atom, Line, Module}, {atom, Line, Function}, {integer, Line, 0}
}}
]},
add_function_transforms(Line, {cons, Line, NewFunction, DefaultAttrs}, Remainder);
add_function_transforms(Line, DefaultAttrs, [{Atom, on_log, {Module, Function}} | Remainder]) ->
NewFunction = {tuple, Line, [
{atom, Line, Atom},
{call, Line, {remote, Line, {atom, Line, Module}, {atom, Line, Function}}, []}
]},
add_function_transforms(Line, {cons, Line, NewFunction, DefaultAttrs}, Remainder).
do_transform(Line, SinkName, Severity, Arguments0) ->
do_transform(Line, SinkName, Severity, Arguments0, safe).
do_transform(Line, SinkName, Severity, Arguments0, Safety) ->
SeverityAsInt = rumUtil:levelToNum(Severity),
DefaultAttrs0 = {cons, Line, {tuple, Line, [
{atom, Line, module}, {atom, Line, get(module)}]},
{cons, Line, {tuple, Line, [
{atom, Line, function}, {atom, Line, get(function)}]},
{cons, Line, {tuple, Line, [
{atom, Line, line},
{integer, Line, Line}]},
{cons, Line, {tuple, Line, [
{atom, Line, pid},
{call, Line, {atom, Line, pid_to_list}, [
{call, Line, {atom, Line, self}, []}]}]},
{cons, Line, {tuple, Line, [
{atom, Line, node},
{call, Line, {atom, Line, node}, []}]},
%% get the metadata with lager:md(), this will always return a list so we can use it as the tail here
{call, Line, {remote, Line, {atom, Line, lager}, {atom, Line, md}}, []}}}}}},
%{nil, Line}}}}}}},
Functions = get(functions),
DefaultAttrs1 = add_function_transforms(Line, DefaultAttrs0, Functions),
DefaultAttrs = case erlang:get(application) of
undefined ->
DefaultAttrs1;
App ->
%% stick the application in the attribute list
concat_lists({cons, Line, {tuple, Line, [
{atom, Line, application},
{atom, Line, App}]},
{nil, Line}}, DefaultAttrs1)
end,
{Meta, Message, Arguments} = handle_args(DefaultAttrs, Line, Arguments0),
%% Generate some unique variable names so we don't accidentally export from case clauses.
%% Note that these are not actual atoms, but the AST treats variable names as atoms.
LevelVar = make_varname("__Level", Line),
TracesVar = make_varname("__Traces", Line),
PidVar = make_varname("__Pid", Line),
LogFun = case Safety of
safe ->
do_log;
unsafe ->
do_log_unsafe
end,
%% Wrap the call to lager:dispatch_log/6 in case that will avoid doing any work if this message is not elegible for logging
%% See lager.erl (lines 89-100) for lager:dispatch_log/6
%% case {whereis(Sink), whereis(?DEFAULT_SINK), lager_config:get({Sink, loglevel}, {?LOG_NONE, []})} of
{'case', Line,
{tuple, Line,
[{call, Line, {atom, Line, whereis}, [{atom, Line, SinkName}]},
{call, Line, {atom, Line, whereis}, [{atom, Line, ?RumDefSink}]},
{call, Line,
{remote, Line, {atom, Line, lager_config}, {atom, Line, get}},
[{tuple, Line, [{atom, Line, SinkName}, {atom, Line, loglevel}]},
{tuple, Line, [{integer, Line, 0}, {nil, Line}]}]}]},
%% {undefined, undefined, _} -> {error, lager_not_running};
[{clause, Line,
[{tuple, Line,
[{atom, Line, undefined}, {atom, Line, undefined}, {var, Line, '_'}]}],
[],
%% trick the linter into avoiding a 'term constructed but not used' error:
%% (fun() -> {error, lager_not_running} end)()
[{call, Line, {'fun', Line, {clauses, [{clause, Line, [], [], [{tuple, Line, [{atom, Line, error}, {atom, Line, lager_not_running}]}]}]}}, []}]
},
%% {undefined, _, _} -> {error, {sink_not_configured, Sink}};
{clause, Line,
[{tuple, Line,
[{atom, Line, undefined}, {var, Line, '_'}, {var, Line, '_'}]}],
[],
%% same trick as above to avoid linter error
[{call, Line, {'fun', Line, {clauses, [{clause, Line, [], [], [{tuple, Line, [{atom, Line, error}, {tuple, Line, [{atom, Line, sink_not_configured}, {atom, Line, SinkName}]}]}]}]}}, []}]
},
%% {SinkPid, _, {Level, Traces}} when ... -> lager:do_log/9;
{clause, Line,
[{tuple, Line,
[{var, Line, PidVar},
{var, Line, '_'},
{tuple, Line, [{var, Line, LevelVar}, {var, Line, TracesVar}]}]}],
[[{op, Line, 'orelse',
{op, Line, '/=', {op, Line, 'band', {var, Line, LevelVar}, {integer, Line, SeverityAsInt}}, {integer, Line, 0}},
{op, Line, '/=', {var, Line, TracesVar}, {nil, Line}}}]],
[{call, Line, {remote, Line, {atom, Line, lager}, {atom, Line, LogFun}},
[{atom, Line, Severity},
Meta,
Message,
Arguments,
{integer, Line, get(truncation_size)},
{integer, Line, SeverityAsInt},
{var, Line, LevelVar},
{var, Line, TracesVar},
{atom, Line, SinkName},
{var, Line, PidVar}]}]},
%% _ -> ok
{clause, Line, [{var, Line, '_'}], [], [{atom, Line, ok}]}]}.
handle_args(DefaultAttrs, Line, [{cons, LineNum, {tuple, _, _}, _} = Attrs]) ->
{concat_lists(DefaultAttrs, Attrs), {string, LineNum, ""}, {atom, Line, none}};
handle_args(DefaultAttrs, Line, [Format]) ->
{DefaultAttrs, Format, {atom, Line, none}};
handle_args(DefaultAttrs, Line, [Arg1, Arg2]) ->
%% some ambiguity here, figure out if these arguments are
%% [Format, Args] or [Attr, Format].
%% The trace attributes will be a list of tuples, so check
%% for that.
case {element(1, Arg1), Arg1} of
{_, {cons, _, {tuple, _, _}, _}} ->
{concat_lists(Arg1, DefaultAttrs),
Arg2, {atom, Line, none}};
{Type, _} when Type == var;
Type == lc;
Type == call;
Type == record_field ->
%% crap, its not a literal. look at the second
%% argument to see if it is a string
case Arg2 of
{string, _, _} ->
{concat_lists(Arg1, DefaultAttrs),
Arg2, {atom, Line, none}};
_ ->
%% not a string, going to have to guess
%% it's the argument list
{DefaultAttrs, Arg1, Arg2}
end;
_ ->
{DefaultAttrs, Arg1, Arg2}
end;
handle_args(DefaultAttrs, _Line, [Attrs, Format, Args]) ->
{concat_lists(Attrs, DefaultAttrs), Format, Args}.
make_varname(Prefix, CallAnno) ->
list_to_atom(Prefix ++ atom_to_list(get(module)) ++ integer_to_list(erl_anno:line(CallAnno))).
%% concat 2 list ASTs by replacing the terminating [] in A with the contents of B
concat_lists({var, Line, _Name} = Var, B) ->
%% concatenating a var with a cons
{call, Line, {remote, Line, {atom, Line, lists}, {atom, Line, flatten}},
[{cons, Line, Var, B}]};
concat_lists({lc, Line, _Body, _Generator} = LC, B) ->
%% concatenating a LC with a cons
{call, Line, {remote, Line, {atom, Line, lists}, {atom, Line, flatten}},
[{cons, Line, LC, B}]};
concat_lists({call, Line, _Function, _Args} = Call, B) ->
%% concatenating a call with a cons
{call, Line, {remote, Line, {atom, Line, lists}, {atom, Line, flatten}},
[{cons, Line, Call, B}]};
concat_lists({record_field, Line, _Var, _Record, _Field} = Rec, B) ->
%% concatenating a record_field with a cons
{call, Line, {remote, Line, {atom, Line, lists}, {atom, Line, flatten}},
[{cons, Line, Rec, B}]};
concat_lists({nil, _Line}, B) ->
B;
concat_lists({cons, Line, Element, Tail}, B) ->
{cons, Line, Element, concat_lists(Tail, B)}.
stash_record(Record) ->
Records = case erlang:get(records) of
undefined ->
[];
R ->
R
end,
erlang:put(records, [Record | Records]).
insert_record_attribute(AST) ->
lists:foldl(fun({attribute, Line, module, _} = E, Acc) ->
[E, {attribute, Line, lager_records, erlang:get(records)} | Acc];
(E, Acc) ->
[E | Acc]
end, [], AST).
guess_application(Dirname, Attr) when Dirname /= undefined ->
case find_app_file(Dirname) of
no_idea ->
%% try it based on source file directory (app.src most likely)
guess_application(undefined, Attr);
_ ->
ok
end;
guess_application(undefined, {attribute, _, file, {Filename, _}}) ->
Dir = filename:dirname(Filename),
find_app_file(Dir);
guess_application(_, _) ->
ok.
find_app_file(Dir) ->
case filelib:wildcard(Dir ++ "/*.{app,app.src}") of
[] ->
no_idea;
[File] ->
case file:consult(File) of
{ok, [{application, Appname, _Attributes} | _]} ->
erlang:put(application, Appname);
_ ->
no_idea
end;
_ ->
%% multiple files, uh oh
no_idea
end.

+ 1
- 1
src/utils/rumConfig.erl Vedi File

@ -1,6 +1,6 @@
-module(rumConfig).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([
init/0

+ 1
- 1
src/utils/rumMsg.erl Vedi File

@ -1,6 +1,6 @@
-module(rumMsg).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([new/4, new/5]).
-export([message/1]).

+ 1
- 1
src/utils/rumUtil.erl Vedi File

@ -1,6 +1,6 @@
-module(rumUtil).
-include("eRum.hrl").
-include("rumDef.hrl").
-include_lib("kernel/include/file.hrl").
-export([

+ 1
- 1
src/watcher/rumHWatcherSrv.erl Vedi File

@ -2,7 +2,7 @@
-behaviour(gen_srv).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([
start/3

+ 1
- 1
test/lager_crash_backend.erl Vedi File

@ -16,7 +16,7 @@
-module(lager_crash_backend).
-include("eRum.hrl").
-include("rumDef.hrl").
-behaviour(gen_event).

+ 1
- 1
test/lager_slow_backend.erl Vedi File

@ -4,7 +4,7 @@
-export([init/1, handle_call/2, handle_event/2, handle_info/2, terminate/2, code_change/3]).
-include("eRum.hrl").
-include("rumDef.hrl").
-record(state, {
delay :: non_neg_integer()

+ 1
- 1
test/lager_test_function_transform.erl Vedi File

@ -20,7 +20,7 @@
-module(lager_test_function_transform).
-include("eRum.hrl").
-include("rumDef.hrl").
-compile([{nowarn_deprecated_function, [{erlang, now, 0}]}]).

Caricamento…
Annulla
Salva