瀏覽代碼

ft: 代码修改

SisMaker 4 年之前
父節點
當前提交
23026fefd2
共有 11 個檔案被更改,包括 128 行新增146 行删除
  1. +12
    -12
      src/backend/rumBkdConsole.erl
  2. +50
    -48
      src/backend/rumBkdFile.erl
  3. +1
    -1
      src/backend/rumBkdThrottle.erl
  4. +13
    -25
      src/eRum.erl
  5. +2
    -2
      src/eRum_app.erl
  6. +1
    -1
      src/errLogger/rumErrLoggerH.erl
  7. +1
    -1
      src/mgrKiller/rumMgrKiller.erl
  8. +5
    -4
      src/test/lager_common_test_backend.erl
  9. +1
    -1
      src/utils/rumConfig.erl
  10. +41
    -50
      src/utils/rumUtil.erl
  11. +1
    -1
      test/lager_slow_backend.erl

+ 12
- 12
src/backend/rumBkdConsole.erl 查看文件

@ -29,7 +29,7 @@
-define(DefOpts, [{use_stderr, false}, {group_leader, false}, {id, ?MODULE}, {formatter, rumFormatter}, {formatter_config, ?DEFAULT_FORMAT_CONFIG}]). -define(DefOpts, [{use_stderr, false}, {group_leader, false}, {id, ?MODULE}, {formatter, rumFormatter}, {formatter_config, ?DEFAULT_FORMAT_CONFIG}]).
-record(state, { -record(state, {
level :: {'mask', integer()},
level :: integer(),
out = user :: user | standard_error | pid(), out = user :: user | standard_error | pid(),
id :: atom() | {atom(), any()}, id :: atom() | {atom(), any()},
formatter :: atom(), formatter :: atom(),
@ -56,7 +56,7 @@ init(Opts) ->
true = checkOpts(Opts), true = checkOpts(Opts),
Colors = ?IIF(rumUtil:get_env(colored, false), rumUtil:get_env(colors, []), []), Colors = ?IIF(rumUtil:get_env(colored, false), rumUtil:get_env(colors, []), []),
Level = rumUtil:get_opt(level, Opts, undefined), Level = rumUtil:get_opt(level, Opts, undefined),
LevelMask = rumUtil:config_to_mask(Level),
LevelMask = rumUtil:configToMask(Level),
[UseErr, GroupLeader, Id, Formatter, Config] = [rumUtil:get_opt(Key, Opts, Def) || {Key, Def} <- ?DefOpts], [UseErr, GroupLeader, Id, Formatter, Config] = [rumUtil:get_opt(Key, Opts, Def) || {Key, Def} <- ?DefOpts],
Out = ?IIF(UseErr, standard_error, ?IIF(GroupLeader == false, user, begin erlang:monitor(process, GroupLeader), GroupLeader end)), Out = ?IIF(UseErr, standard_error, ?IIF(GroupLeader == false, user, begin erlang:monitor(process, GroupLeader), GroupLeader end)),
{ok, #state{level = LevelMask, id = Id, out = Out, formatter = Formatter, formatConfig = Config, colors = Colors}} {ok, #state{level = LevelMask, id = Id, out = Out, formatter = Formatter, formatConfig = Config, colors = Colors}}
@ -83,19 +83,19 @@ checkOpts([H | _]) ->
handleCall(mGetLogLevel, #state{level = Level} = State) -> handleCall(mGetLogLevel, #state{level = Level} = State) ->
{reply, Level, State}; {reply, Level, State};
handleCall({mSetLogLevel, Level}, State) -> handleCall({mSetLogLevel, Level}, State) ->
try rumUtil:config_to_mask(Level) of
try rumUtil:configToMask(Level) of
Levels -> Levels ->
{reply, ok, State#state{level = Levels}} {reply, ok, State#state{level = Levels}}
catch catch
_:_ -> _:_ ->
{reply, {error, bad_log_level}, State}
{reply, {error, bad_log_level}, State}clo
end; end;
handleCall(_Msg, State) -> handleCall(_Msg, State) ->
?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]), ?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]),
{reply, ok, State}. {reply, ok, State}.
handleEvent({mWriteLog, Message}, #state{level = Level, out = Out, formatter = Formatter, formatConfig = FormatConfig, colors = Colors, id = ID}) -> handleEvent({mWriteLog, Message}, #state{level = Level, out = Out, formatter = Formatter, formatConfig = FormatConfig, colors = Colors, id = ID}) ->
case rumUtil:is_loggable(Message, Level, ID) of
case rumUtil:isLoggAble(Message, Level, ID) of
true -> true ->
io:put_chars(Out, Formatter:format(Message, FormatConfig, Colors)), io:put_chars(Out, Formatter:format(Message, FormatConfig, Colors)),
kpS; kpS;
@ -195,7 +195,7 @@ console_log_test_() ->
register(user, Pid), register(user, Pid),
erlang:group_leader(Pid, whereis(rumEvent)), erlang:group_leader(Pid, whereis(rumEvent)),
gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]), gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
eRum:log(info, self(), "Test message"), eRum:log(info, self(), "Test message"),
receive receive
{io_request, From, ReplyAs, {put_chars, unicode, Msg}} -> {io_request, From, ReplyAs, {put_chars, unicode, Msg}} ->
@ -215,7 +215,7 @@ console_log_test_() ->
register(user, Pid), register(user, Pid),
erlang:group_leader(Pid, whereis(rumEvent)), erlang:group_leader(Pid, whereis(rumEvent)),
gen_event:add_handler(rumEvent, lager_console_backend, [info, true]), gen_event:add_handler(rumEvent, lager_console_backend, [info, true]),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
eRum:info("Test message"), eRum:info("Test message"),
PidStr = pid_to_list(self()), PidStr = pid_to_list(self()),
receive receive
@ -260,7 +260,7 @@ console_log_test_() ->
register(user, Pid), register(user, Pid),
gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]), gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]),
erlang:group_leader(Pid, whereis(rumEvent)), erlang:group_leader(Pid, whereis(rumEvent)),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
eRum:debug("Test message"), eRum:debug("Test message"),
receive receive
{io_request, From, ReplyAs, {put_chars, unicode, _Msg}} -> {io_request, From, ReplyAs, {put_chars, unicode, _Msg}} ->
@ -289,7 +289,7 @@ console_log_test_() ->
unregister(user), unregister(user),
register(user, Pid), register(user, Pid),
gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]), gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
erlang:group_leader(Pid, whereis(rumEvent)), erlang:group_leader(Pid, whereis(rumEvent)),
eRum:debug("Test message"), eRum:debug("Test message"),
receive receive
@ -328,7 +328,7 @@ console_log_test_() ->
unregister(user), unregister(user),
register(user, Pid), register(user, Pid),
gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]), gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
eRum:set_loglevel(lager_console_backend, '!=info'), eRum:set_loglevel(lager_console_backend, '!=info'),
erlang:group_leader(Pid, whereis(rumEvent)), erlang:group_leader(Pid, whereis(rumEvent)),
eRum:debug("Test message"), eRum:debug("Test message"),
@ -359,7 +359,7 @@ console_log_test_() ->
unregister(user), unregister(user),
register(user, Pid), register(user, Pid),
gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]), gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}]),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
eRum:set_loglevel(lager_console_backend, '=debug'), eRum:set_loglevel(lager_console_backend, '=debug'),
erlang:group_leader(Pid, whereis(rumEvent)), erlang:group_leader(Pid, whereis(rumEvent)),
eRum:debug("Test message"), eRum:debug("Test message"),
@ -388,7 +388,7 @@ console_log_test_() ->
fun() -> fun() ->
Pid = spawn(F(self())), Pid = spawn(F(self())),
gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}, {group_leader, Pid}]), gen_event:add_handler(rumEvent, lager_console_backend, [{level, info}, {group_leader, Pid}]),
rumConfig:set({rumEvent, loglevel}, {element(2, rumUtil:config_to_mask(info)), []}),
rumConfig:set({rumEvent, loglevel}, {rumUtil:configToMask(info), []}),
eRum:info("Test message"), eRum:info("Test message"),
?assertNotEqual({group_leader, Pid}, erlang:process_info(whereis(rumEvent), group_leader)), ?assertNotEqual({group_leader, Pid}, erlang:process_info(whereis(rumEvent), group_leader)),
receive receive

+ 50
- 48
src/backend/rumBkdFile.erl 查看文件

@ -19,7 +19,7 @@
-compile([{parse_transform, lager_transform}]). -compile([{parse_transform, lager_transform}]).
-endif. -endif.
-export([config_to_id/1]).
-export([configToId/1]).
-export([ -export([
init/1 init/1
@ -32,7 +32,7 @@
-record(state, { -record(state, {
fileName :: string(), fileName :: string(),
level :: {'mask', integer()},
level :: integer(),
fd :: file:io_device() | undefined, fd :: file:io_device() | undefined,
inode :: integer() | undefined, inode :: integer() | undefined,
ctime :: file:date_time() | undefined, ctime :: file:date_time() | undefined,
@ -44,7 +44,7 @@
shaper :: rumShaper(), shaper :: rumShaper(),
formatter :: atom(), formatter :: atom(),
formatterConfig :: any(), formatterConfig :: any(),
sync_on :: {'mask', integer()},
sync_on :: integer(),
checkInterval = ?RumDefCheckInterval :: non_neg_integer(), checkInterval = ?RumDefCheckInterval :: non_neg_integer(),
syncInterval = ?RumDefSyncInterval :: non_neg_integer(), syncInterval = ?RumDefSyncInterval :: non_neg_integer(),
sync_size = ?RumDefSyncSize :: non_neg_integer(), sync_size = ?RumDefSyncSize :: non_neg_integer(),
@ -89,12 +89,12 @@ init(Opts) ->
FormatterConfig = rumUtil:get_opt(formatter_config, Opts, ?RumDefFormatterCfg), FormatterConfig = rumUtil:get_opt(formatter_config, Opts, ?RumDefFormatterCfg),
%% %%
Level = validate_loglevel(CfgLevel),
SyncOn = validate_loglevel(CfgSyncOn),
Level = validateLogLevel(CfgLevel),
SyncOn = validateLogLevel(CfgSyncOn),
CheckInterval = ?IIF(CfgCheckInterval == always, 0, CfgCheckInterval), CheckInterval = ?IIF(CfgCheckInterval == always, 0, CfgCheckInterval),
{ok, Date} = rumUtil:parseRotateSpec(CfgDate), {ok, Date} = rumUtil:parseRotateSpec(CfgDate),
FileName = rumUtil:parsePath(RelName), FileName = rumUtil:parsePath(RelName),
scheduleRotation(Date, FileName), scheduleRotation(Date, FileName),
Shaper = rumUtil:maybe_flush(Flush, #rumShaper{hwm = HighWaterMark, flushThreshold = FlushThr, id = FileName}), Shaper = rumUtil:maybe_flush(Flush, #rumShaper{hwm = HighWaterMark, flushThreshold = FlushThr, id = FileName}),
TemState = #state{ TemState = #state{
@ -115,7 +115,7 @@ init(Opts) ->
handleCall(mGetLogLevel, #state{level = Level} = State) -> handleCall(mGetLogLevel, #state{level = Level} = State) ->
{reply, Level, State}; {reply, Level, State};
handleCall({mSetLogLevel, Level}, #state{fileName = Ident} = State) -> handleCall({mSetLogLevel, Level}, #state{fileName = Ident} = State) ->
case validate_loglevel(Level) of
case validateLogLevel(Level) of
false -> false ->
{reply, {error, bad_loglevel}, State}; {reply, {error, bad_loglevel}, State};
Levels -> Levels ->
@ -139,8 +139,8 @@ handleCall(_Msg, State) ->
?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]), ?ERR("~p call receive unexpect msg ~p ~n ", [?MODULE, _Msg]),
{reply, ok, State}. {reply, ok, State}.
handleEvent({mWriteLog, Message}, #state{fileName = FileName, level = L, shaper = Shaper, formatter = Formatter, formatterConfig = FormatConfig} = State) ->
case rumUtil:is_loggable(Message, L, {rumBkdFile, FileName}) of
handleEvent({mWriteLog, Message}, #state{fileName = FileName, level = Level, shaper = Shaper, formatter = Formatter, formatterConfig = FormatConfig} = State) ->
case rumUtil:isLoggAble(Message, Level, {rumBkdFile, FileName}) of
true -> true ->
case rumUtil:check_hwm(Shaper) of case rumUtil:check_hwm(Shaper) of
{true, Drop, #rumShaper{hwm = Hwm} = NewShaper} -> {true, Drop, #rumShaper{hwm = Hwm} = NewShaper} ->
@ -167,11 +167,11 @@ handleEvent(_Msg, _State) ->
kpS. kpS.
handleInfo({mRotate, File}, #state{fileName = File, count = Count, date = Date, rotator = Rotator} = State0) -> handleInfo({mRotate, File}, #state{fileName = File, count = Count, date = Date, rotator = Rotator} = State0) ->
State1 = close_file(State0),
State1 = closeFile(State0),
_ = Rotator:rotateLogfile(File, Count), _ = Rotator:rotateLogfile(File, Count),
scheduleRotation(File, Date), scheduleRotation(File, Date),
{ok, State1}; {ok, State1};
handleInfo({shaper_expired, Name}, #state{shaper = Shaper, fileName = Name, formatter = Formatter, formatterConfig = FormatConfig} = State) ->
handleInfo({mShaperExpired, Name}, #state{shaper = Shaper, fileName = Name, formatter = Formatter, formatterConfig = FormatConfig} = State) ->
_ = case Shaper#rumShaper.dropped of _ = case Shaper#rumShaper.dropped of
0 -> 0 ->
ok; ok;
@ -189,29 +189,12 @@ handleInfo(_Info, State) ->
terminate(_Reason, State) -> terminate(_Reason, State) ->
%% leaving this function call unmatched makes dialyzer cranky %% leaving this function call unmatched makes dialyzer cranky
_ = close_file(State),
_ = closeFile(State),
ok. ok.
code_change(_OldVsn, State, _Extra) -> code_change(_OldVsn, State, _Extra) ->
{ok, State}. {ok, State}.
%% Convert the config into a gen_event handler ID
config_to_id({Name, _Severity}) when is_list(Name) ->
{?MODULE, Name};
config_to_id({Name, _Severity, _Size, _Rotation, _Count}) ->
{?MODULE, Name};
config_to_id([{Name, _Severity, _Size, _Rotation, _Count}, _Format]) ->
{?MODULE, Name};
config_to_id([{Name, _Severity}, _Format]) when is_list(Name) ->
{?MODULE, Name};
config_to_id(Config) ->
case proplists:get_value(file, Config) of
undefined ->
erlang:error(no_file);
File ->
{?MODULE, File}
end.
write(#state{fileName = Name, fd = FD, write(#state{fileName = Name, fd = FD,
inode = Inode, ctime = Ctime, inode = Inode, ctime = Ctime,
flap = Flap, size = RotSize, flap = Flap, size = RotSize,
@ -222,7 +205,7 @@ write(#state{fileName = Name, fd = FD,
Buffer = {State0#state.sync_size, State0#state.syncInterval}, Buffer = {State0#state.sync_size, State0#state.syncInterval},
case Rotator:ensureLogfile(Name, FD, Inode, Ctime, Buffer) of case Rotator:ensureLogfile(Name, FD, Inode, Ctime, Buffer) of
{ok, {_FD, _Inode, _Ctime, Size}} when RotSize > 0, Size > RotSize -> {ok, {_FD, _Inode, _Ctime, Size}} when RotSize > 0, Size > RotSize ->
State1 = close_file(State0),
State1 = closeFile(State0),
case Rotator:rotateLogfile(Name, Count) of case Rotator:rotateLogfile(Name, Count) of
ok -> ok ->
%% go around the loop again, we'll do another rotation check and hit the next clause of ensureLogfile %% go around the loop again, we'll do another rotation check and hit the next clause of ensureLogfile
@ -271,7 +254,7 @@ write_should_check(#state{lastCheck = LastCheck0, checkInterval = CheckInterval,
do_write(#state{fd = FD, fileName = Name, flap = Flap} = State, Level, Msg) -> do_write(#state{fd = FD, fileName = Name, flap = Flap} = State, Level, Msg) ->
%% delayed_write doesn't report errors %% delayed_write doesn't report errors
_ = file:write(FD, unicode:characters_to_binary(Msg)), _ = file:write(FD, unicode:characters_to_binary(Msg)),
{mask, SyncLevel} = State#state.sync_on,
SyncLevel = State#state.sync_on,
case (Level band SyncLevel) =/= 0 of case (Level band SyncLevel) =/= 0 of
true -> true ->
%% force a sync on any message that matches the 'sync_on' bitmask %% force a sync on any message that matches the 'sync_on' bitmask
@ -290,8 +273,25 @@ do_write(#state{fd = FD, fileName = Name, flap = Flap} = State, Level, Msg) ->
State State
end. end.
validate_loglevel(Level) ->
try rumUtil:config_to_mask(Level) of
%% Convert the config into a gen_event handler ID
configToId({Name, _Severity}) when is_list(Name) ->
{?MODULE, Name};
configToId({Name, _Severity, _Size, _Rotation, _Count}) ->
{?MODULE, Name};
configToId([{Name, _Severity, _Size, _Rotation, _Count}, _Format]) ->
{?MODULE, Name};
configToId([{Name, _Severity}, _Format]) when is_list(Name) ->
{?MODULE, Name};
configToId(Config) ->
case proplists:get_value(file, Config) of
undefined ->
erlang:error(no_file);
File ->
{?MODULE, File}
end.
validateLogLevel(Level) ->
try rumUtil:configToMask(Level) of
Levels -> Levels ->
Levels Levels
catch catch
@ -304,7 +304,7 @@ checkOpts([], IsFile) ->
checkOpts([{file, _File} | Tail], _IsFile) -> checkOpts([{file, _File} | Tail], _IsFile) ->
checkOpts(Tail, true); checkOpts(Tail, true);
checkOpts([{level, Level} | Tail], IsFile) -> checkOpts([{level, Level} | Tail], IsFile) ->
?IIF(validate_loglevel(Level), checkOpts(Tail, IsFile), ({error, {invalid_log_level, Level}}));
?IIF(validateLogLevel(Level), checkOpts(Tail, IsFile), ({error, {invalid_log_level, Level}}));
checkOpts([{size, Size} | Tail], IsFile) when is_integer(Size), Size >= 0 -> checkOpts([{size, Size} | Tail], IsFile) when is_integer(Size), Size >= 0 ->
checkOpts(Tail, IsFile); checkOpts(Tail, IsFile);
checkOpts([{count, Count} | Tail], IsFile) when is_integer(Count), Count >= 0 -> checkOpts([{count, Count} | Tail], IsFile) when is_integer(Count), Count >= 0 ->
@ -340,30 +340,32 @@ scheduleRotation(Date, Name) ->
erlang:send_after(rumUtil:calcNextRotateMs(Date), self(), {mRotate, Name}), erlang:send_after(rumUtil:calcNextRotateMs(Date), self(), {mRotate, Name}),
ok. ok.
close_file(#state{fd = undefined} = State) ->
State;
close_file(#state{fd = FD} = State) ->
%% Flush and close any file handles.
%% delayed write can cause file:close not to do a close
_ = file:datasync(FD),
_ = file:close(FD),
_ = file:close(FD),
State#state{fd = undefined}.
closeFile(#state{fd = Fd} = State) ->
case Fd of
undefined -> State;
_ ->
%% Flush and close any file handles.
%% delayed write can cause file:close not to do a close
_ = file:datasync(Fd),
_ = file:close(Fd),
_ = file:close(Fd),
State#state{fd = undefined}
end.
-ifdef(TEST). -ifdef(TEST).
get_loglevel_test() -> get_loglevel_test() ->
{ok, Level, _} = handleCall(mGetLogLevel, {ok, Level, _} = handleCall(mGetLogLevel,
#state{fileName = "bar", level = rumUtil:config_to_mask(info), fd = 0, inode = 0, ctime = undefined}),
?assertEqual(Level, rumUtil:config_to_mask(info)),
#state{fileName = "bar", level = rumUtil:configToMask(info), fd = 0, inode = 0, ctime = undefined}),
?assertEqual(Level, rumUtil:configToMask(info)),
{ok, Level2, _} = handleCall(mGetLogLevel, {ok, Level2, _} = handleCall(mGetLogLevel,
#state{fileName = "foo", level = rumUtil:config_to_mask(warning), fd = 0, inode = 0, ctime = undefined}),
?assertEqual(Level2, rumUtil:config_to_mask(warning)).
#state{fileName = "foo", level = rumUtil:configToMask(warning), fd = 0, inode = 0, ctime = undefined}),
?assertEqual(Level2, rumUtil:configToMask(warning)).
rotation_test_() -> rotation_test_() ->
{foreach, {foreach,
fun() -> fun() ->
SyncLevel = validate_loglevel(?RumDefSyncLevel),
SyncLevel = validateLogLevel(?RumDefSyncLevel),
SyncSize = ?RumDefSyncSize, SyncSize = ?RumDefSyncSize,
SyncInterval = ?RumDefSyncInterval, SyncInterval = ?RumDefSyncInterval,
Rotator = ?RumDefRotateMod, Rotator = ?RumDefRotateMod,

+ 1
- 1
src/backend/rumBkdThrottle.erl 查看文件

@ -31,7 +31,7 @@ init([{sink, Sink}, Hwm, Window]) ->
{ok, #state{sink = Sink, hwm = Hwm, window_min = Hwm - Window}}. {ok, #state{sink = Sink, hwm = Hwm, window_min = Hwm - Window}}.
handle_call(mGetLogLevel, State) -> handle_call(mGetLogLevel, State) ->
{ok, {mask, ?LOG_NONE}, State};
{ok, ?LOG_NONE, State};
handle_call({mSetLogLevel, _Level}, State) -> handle_call({mSetLogLevel, _Level}, State) ->
{ok, ok, State}; {ok, ok, State};
handle_call(_Request, State) -> handle_call(_Request, State) ->

+ 13
- 25
src/eRum.erl 查看文件

@ -46,7 +46,7 @@
, set_loglevel/2 , set_loglevel/2
, set_loglevel/3 , set_loglevel/3
, set_loglevel/4 , set_loglevel/4
, get_loglevels/1
, getLogLevels/1
, updateLogevelCfg/1 , updateLogevelCfg/1
, posix_error/1 , posix_error/1
, set_loghwm/2 , set_loghwm/2
@ -422,15 +422,12 @@ status() ->
Handlers)], Handlers)],
"Active Traces:\n", "Active Traces:\n",
[begin [begin
LevelName = case Level of
{mask, Mask} ->
LevelName =
case rumUtil:maskToLevels(Mask) of case rumUtil:maskToLevels(Mask) of
[] -> none; [] -> none;
Levels -> hd(Levels) Levels -> hd(Levels)
end;
Num ->
rumUtil:numToLevel(Num)
end,
end,
io_lib:format("Tracing messages matching ~p (sink ~s) at level ~p to ~p\n", io_lib:format("Tracing messages matching ~p (sink ~s) at level ~p to ~p\n",
[Filter, Sink, LevelName, Destination]) [Filter, Sink, LevelName, Destination])
end || {Sink, {Filter, Level, Destination}} <- Traces], end || {Sink, {Filter, Level, Destination}} <- Traces],
@ -491,13 +488,11 @@ get_loglevel(Handler) ->
%% has multiple identifiers, the lowest is returned. %% has multiple identifiers, the lowest is returned.
get_loglevel(Sink, Handler) -> get_loglevel(Sink, Handler) ->
case gen_event:call(Sink, Handler, mGetLogLevel, infinity) of case gen_event:call(Sink, Handler, mGetLogLevel, infinity) of
{mask, Mask} ->
Mask when is_integer(Mask) ->
case rumUtil:maskToLevels(Mask) of case rumUtil:maskToLevels(Mask) of
[] -> none; [] -> none;
Levels -> hd(Levels) Levels -> hd(Levels)
end; end;
X when is_integer(X) ->
rumUtil:numToLevel(X);
Y -> Y Y -> Y
end. end.
@ -511,10 +506,8 @@ posix_error(Error) when is_atom(Error) ->
posix_error(Error) -> posix_error(Error) ->
safe_format_chop("~p", [Error], ?RumDefTruncation). safe_format_chop("~p", [Error], ?RumDefTruncation).
%% @private
get_loglevels(Sink) ->
[gen_event:call(Sink, Handler, mGetLogLevel, infinity) ||
Handler <- gen_event:which_handlers(Sink)].
getLogLevels(Sink) ->
[gen_event:call(Sink, Handler, mGetLogLevel, infinity) || Handler <- gen_event:which_handlers(Sink)].
%% @doc Set the loghwm for the default sink. %% @doc Set the loghwm for the default sink.
set_loghwm(Handler, Hwm) when is_integer(Hwm) -> set_loghwm(Handler, Hwm) when is_integer(Hwm) ->
@ -547,19 +540,14 @@ updateLogevelCfg(error_logger) ->
true; true;
updateLogevelCfg(Sink) -> updateLogevelCfg(Sink) ->
{_, Traces} = rumConfig:get({Sink, loglevel}, {ignore_me, []}), {_, Traces} = rumConfig:get({Sink, loglevel}, {ignore_me, []}),
MinLog = minimum_loglevel(get_loglevels(Sink)),
MinLog = minLogLevel(getLogLevels(Sink)),
rumConfig:set({Sink, loglevel}, {MinLog, Traces}). rumConfig:set({Sink, loglevel}, {MinLog, Traces}).
%% @private
minimum_loglevel(Levels) ->
lists:foldl(fun({mask, Mask}, Acc) ->
Mask bor Acc;
(Level, Acc) when is_integer(Level) ->
{mask, Mask} = rumUtil:config_to_mask(rumUtil:numToLevel(Level)),
Mask bor Acc;
(_, Acc) ->
Acc
end, 0, Levels).
minLogLevel(Levels) ->
lists:foldl(
fun(Mask, Acc) ->
Mask bor Acc
end, 0, Levels).
%% @doc Print the format string `Fmt' with `Args' safely with a size %% @doc Print the format string `Fmt' with `Args' safely with a size
%% limit of `Limit'. If the format string is invalid, or not enough %% limit of `Limit'. If the format string is invalid, or not enough

+ 2
- 2
src/eRum_app.erl 查看文件

@ -187,7 +187,7 @@ parseHandlers([{lager_file_backend, [{Key, _Value} | _] = Config} | T]) when is_
[maybe_make_handler_id(lager_file_backend, Config) | parseHandlers(T)]; [maybe_make_handler_id(lager_file_backend, Config) | parseHandlers(T)];
parseHandlers([{lager_file_backend, Configs} | T]) -> parseHandlers([{lager_file_backend, Configs} | T]) ->
?INT_LOG(notice, "Deprecated lager_file_backend config detected, please consider updating it", []), ?INT_LOG(notice, "Deprecated lager_file_backend config detected, please consider updating it", []),
[{rumBkdFile:config_to_id(Config), Config} || Config <- Configs] ++
[{rumBkdFile:configToId(Config), Config} || Config <- Configs] ++
parseHandlers(T); parseHandlers(T);
parseHandlers([{Mod, Config} | T]) when is_atom(Mod) -> parseHandlers([{Mod, Config} | T]) when is_atom(Mod) ->
[maybe_make_handler_id(Mod, Config) | parseHandlers(T)]; [maybe_make_handler_id(Mod, Config) | parseHandlers(T)];
@ -205,7 +205,7 @@ maybe_make_handler_id(Mod, Config) ->
%%使: %%使:
%% %%
try Mod:config_to_id(Config) of
try Mod:configToId(Config) of
Id -> Id ->
{Id, Config} {Id, Config}
catch catch

+ 1
- 1
src/errLogger/rumErrLoggerH.erl 查看文件

@ -108,7 +108,7 @@ handle_event(Event, #state{sink = Sink, shaper = Shaper} = State) ->
{ok, State#state{shaper = NewShaper#rumShaper{dropped = D + 1}}} {ok, State#state{shaper = NewShaper#rumShaper{dropped = D + 1}}}
end. end.
handle_info({shaper_expired, ?MODULE}, #state{sink = Sink, shaper = Shaper} = State) ->
handle_info({mShaperExpired, ?MODULE}, #state{sink = Sink, shaper = Shaper} = State) ->
case Shaper#rumShaper.dropped of case Shaper#rumShaper.dropped of
0 -> 0 ->
ok; ok;

+ 1
- 1
src/mgrKiller/rumMgrKiller.erl 查看文件

@ -20,7 +20,7 @@ init([KillerHWM, KillerReinstallAfter]) ->
{ok, #state{killerHwm = KillerHWM, killerReTime = KillerReinstallAfter}}. {ok, #state{killerHwm = KillerHWM, killerReTime = KillerReinstallAfter}}.
handle_call(mGetLogLevel, State) -> handle_call(mGetLogLevel, State) ->
{ok, {mask, ?LOG_NONE}, State};
{ok, ?LOG_NONE, State};
handle_call({mSetLogLevel, _Level}, State) -> handle_call({mSetLogLevel, _Level}, State) ->
{ok, ok, State}; {ok, ok, State};
handle_call(get_settings, State = #state{killerHwm = KillerHWM, killerReTime = KillerReinstallAfter}) -> handle_call(get_settings, State = #state{killerHwm = KillerHWM, killerReTime = KillerReinstallAfter}) ->

+ 5
- 4
src/test/lager_common_test_backend.erl 查看文件

@ -14,7 +14,8 @@
bounce/1]). bounce/1]).
%% holds the log messages for retreival on terminate %% holds the log messages for retreival on terminate
-record(state, {level :: {mask, integer()},
-record(state, {
level :: integer(),
formatter :: atom(), formatter :: atom(),
format_config :: any(), format_config :: any(),
mWriteLog = [] :: list()}). mWriteLog = [] :: list()}).
@ -61,7 +62,7 @@ init([Level, false]) -> % for backwards compatibility
init([Level, {Formatter, FormatterConfig}]) when is_atom(Formatter) -> init([Level, {Formatter, FormatterConfig}]) when is_atom(Formatter) ->
case lists:member(Level, ?RumLevels) of case lists:member(Level, ?RumLevels) of
true -> true ->
{ok, #state{level = rumUtil:config_to_mask(Level),
{ok, #state{level = rumUtil:configToMask(Level),
formatter = Formatter, formatter = Formatter,
format_config = FormatterConfig}}; format_config = FormatterConfig}};
_ -> _ ->
@ -74,7 +75,7 @@ init(Level) ->
%% @private %% @private
handle_event({mWriteLog, Message}, handle_event({mWriteLog, Message},
#state{level = L, formatter = Formatter, format_config = FormatConfig, mWriteLog = Logs} = State) -> #state{level = L, formatter = Formatter, format_config = FormatConfig, mWriteLog = Logs} = State) ->
case rumUtil:is_loggable(Message, L, ?MODULE) of
case rumUtil:isLoggAble(Message, L, ?MODULE) of
true -> true ->
Log = Formatter:format(Message, FormatConfig), Log = Formatter:format(Message, FormatConfig),
ct:pal(Log), ct:pal(Log),
@ -94,7 +95,7 @@ handle_call(mGetLogLevel, #state{level = Level} = State) ->
handle_call({mSetLogLevel, Level}, State) -> handle_call({mSetLogLevel, Level}, State) ->
case lists:member(Level, ?RumLevels) of case lists:member(Level, ?RumLevels) of
true -> true ->
{ok, ok, State#state{level = rumUtil:config_to_mask(Level)}};
{ok, ok, State#state{level = rumUtil:configToMask(Level)}};
_ -> _ ->
{ok, {error, bad_log_level}, State} {ok, {error, bad_log_level}, State}
end; end;

+ 1
- 1
src/utils/rumConfig.erl 查看文件

@ -28,7 +28,7 @@ init() ->
initSink(Sink) -> initSink(Sink) ->
%% use insert_new here so that if we're in an appup we don't mess anything up until lager is completely started, allow all messages to go through %% use insert_new here so that if we're in an appup we don't mess anything up until lager is completely started, allow all messages to go through
insert_new({Sink, loglevel}, {element(2, rumUtil:config_to_mask(debug)), []}).
insert_new({Sink, loglevel}, {rumUtil:configToMask(debug), []}).
global_get(Key) -> global_get(Key) ->
global_get(Key, undefined). global_get(Key, undefined).

+ 41
- 50
src/utils/rumUtil.erl 查看文件

@ -8,7 +8,7 @@
, levelToNum/1 , levelToNum/1
, levelToChr/1 , levelToChr/1
, numToLevel/1 , numToLevel/1
, config_to_mask/1
, configToMask/1
, atomCfgToLevels/1 , atomCfgToLevels/1
, maskToLevels/1 , maskToLevels/1
, nowMs/0 , nowMs/0
@ -20,7 +20,7 @@
, calcNextRotateDt/2 , calcNextRotateDt/2
, validate_trace/1 , validate_trace/1
, check_traces/4 , check_traces/4
, is_loggable/3
, isLoggAble/3
, trace_filter/1 , trace_filter/1
, trace_filter/2 , trace_filter/2
, parsePath/1 , parsePath/1
@ -81,8 +81,8 @@ levelToChr(alert) -> $A;
levelToChr(emergency) -> $M; levelToChr(emergency) -> $M;
levelToChr(none) -> $ . levelToChr(none) -> $ .
-spec config_to_mask(atom()|string()) -> {'mask', integer()}.
config_to_mask(Conf) ->
-spec configToMask(atom()|string()) -> integer().
configToMask(Conf) ->
Levels = atomCfgToLevels(Conf), Levels = atomCfgToLevels(Conf),
levelsToMask(Levels, 0). levelsToMask(Levels, 0).
@ -385,7 +385,7 @@ validate_trace({Filter, Level, {Destination, ID}}) when is_tuple(Filter); is_lis
end; end;
validate_trace({Filter, Level, Destination}) when is_tuple(Filter); is_list(Filter), is_atom(Level), is_atom(Destination) -> validate_trace({Filter, Level, Destination}) when is_tuple(Filter); is_list(Filter), is_atom(Level), is_atom(Destination) ->
ValidFilter = validate_trace_filter(Filter), ValidFilter = validate_trace_filter(Filter),
try config_to_mask(Level) of
try configToMask(Level) of
_ when not ValidFilter -> _ when not ValidFilter ->
{error, invalid_trace}; {error, invalid_trace};
L when is_list(Filter) -> L when is_list(Filter) ->
@ -454,7 +454,7 @@ trace_acc([{Key, '<', Val} | T], Acc) ->
check_traces(_, _, [], Acc) -> check_traces(_, _, [], Acc) ->
lists:flatten(Acc); lists:flatten(Acc);
check_traces(Attrs, Level, [{_, {mask, FilterLevel}, _} | Flows], Acc) when (Level band FilterLevel) == 0 ->
check_traces(Attrs, Level, [{_, FilterLevel, _} | Flows], Acc) when (Level band FilterLevel) == 0 ->
check_traces(Attrs, Level, Flows, Acc); check_traces(Attrs, Level, Flows, Acc);
check_traces(Attrs, Level, [{Filter, _, _} | Flows], Acc) when length(Attrs) < length(Filter) -> check_traces(Attrs, Level, [{Filter, _, _} | Flows], Acc) when length(Attrs) < length(Filter) ->
check_traces(Attrs, Level, Flows, Acc); check_traces(Attrs, Level, Flows, Acc);
@ -475,18 +475,9 @@ check_trace(Attrs, {Filter, _Level, Dest}) when is_tuple(Filter) ->
[] []
end. end.
-spec is_loggable(rumMsg:rumMsg(), non_neg_integer()|{'mask', non_neg_integer()}, term()) -> boolean().
is_loggable(Msg, {mask, Mask}, MyName) ->
%% using syslog style comparison flags
%S = lager_msg:severity_as_int(Msg),
%?debugFmt("comparing masks ~.2B and ~.2B -> ~p~n", [S, Mask, S band Mask]),
(rumMsg:severity_as_int(Msg) band Mask) /= 0 orelse
lists:member(MyName, rumMsg:destinations(Msg));
is_loggable(Msg, SeverityThreshold, MyName) when is_atom(SeverityThreshold) ->
is_loggable(Msg, levelToNum(SeverityThreshold), MyName);
is_loggable(Msg, SeverityThreshold, MyName) when is_integer(SeverityThreshold) ->
rumMsg:severity_as_int(Msg) =< SeverityThreshold orelse
lists:member(MyName, rumMsg:destinations(Msg)).
-spec isLoggAble(rumMsg:rumMsg(), non_neg_integer(), term()) -> boolean().
isLoggAble(Msg, Mask, MyName) ->
(rumMsg:severity_as_int(Msg) band Mask) /= 0 orelse lists:member(MyName, rumMsg:destinations(Msg)).
parsePath(RelPath) -> parsePath(RelPath) ->
NewRelPath = NewRelPath =
@ -559,7 +550,7 @@ check_hwm(Shaper = #rumShaper{lastTime = Last, dropped = Drop}) ->
end, end,
Timer = case erlang:read_timer(Shaper#rumShaper.timer) of Timer = case erlang:read_timer(Shaper#rumShaper.timer) of
false -> false ->
erlang:send_after(trunc((1000000 - N) / 1000), self(), {shaper_expired, Shaper#rumShaper.id});
erlang:send_after(trunc((1000000 - N) / 1000), self(), {mShaperExpired, Shaper#rumShaper.id});
_ -> _ ->
Shaper#rumShaper.timer Shaper#rumShaper.timer
end, end,
@ -735,42 +726,42 @@ check_trace_test() ->
trace_filter(none), trace_filter(none),
%% match by module %% match by module
?assertEqual([foo], check_traces([{module, ?MODULE}], ?EMERGENCY, [ ?assertEqual([foo], check_traces([{module, ?MODULE}], ?EMERGENCY, [
{[{module, ?MODULE}], config_to_mask(emergency), foo},
{[{module, test}], config_to_mask(emergency), bar}], [])),
{[{module, ?MODULE}], configToMask(emergency), foo},
{[{module, test}], configToMask(emergency), bar}], [])),
%% match by module, but other unsatisfyable attribute %% match by module, but other unsatisfyable attribute
?assertEqual([], check_traces([{module, ?MODULE}], ?EMERGENCY, [ ?assertEqual([], check_traces([{module, ?MODULE}], ?EMERGENCY, [
{[{module, ?MODULE}, {foo, bar}], config_to_mask(emergency), foo},
{[{module, test}], config_to_mask(emergency), bar}], [])),
{[{module, ?MODULE}, {foo, bar}], configToMask(emergency), foo},
{[{module, test}], configToMask(emergency), bar}], [])),
%% match by wildcard module %% match by wildcard module
?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [ ?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [
{[{module, ?MODULE}, {foo, bar}], config_to_mask(emergency), foo},
{[{module, '*'}], config_to_mask(emergency), bar}], [])),
{[{module, ?MODULE}, {foo, bar}], configToMask(emergency), foo},
{[{module, '*'}], configToMask(emergency), bar}], [])),
%% wildcard module, one trace with unsatisfyable attribute %% wildcard module, one trace with unsatisfyable attribute
?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [ ?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [
{[{module, '*'}, {foo, bar}], config_to_mask(emergency), foo},
{[{module, '*'}], config_to_mask(emergency), bar}], [])),
{[{module, '*'}, {foo, bar}], configToMask(emergency), foo},
{[{module, '*'}], configToMask(emergency), bar}], [])),
%% wildcard but not present custom trace attribute %% wildcard but not present custom trace attribute
?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [ ?assertEqual([bar], check_traces([{module, ?MODULE}], ?EMERGENCY, [
{[{module, '*'}, {foo, '*'}], config_to_mask(emergency), foo},
{[{module, '*'}], config_to_mask(emergency), bar}], [])),
{[{module, '*'}, {foo, '*'}], configToMask(emergency), foo},
{[{module, '*'}], configToMask(emergency), bar}], [])),
%% wildcarding a custom attribute works when it is present %% wildcarding a custom attribute works when it is present
?assertEqual([bar, foo], check_traces([{module, ?MODULE}, {foo, bar}], ?EMERGENCY, [ ?assertEqual([bar, foo], check_traces([{module, ?MODULE}, {foo, bar}], ?EMERGENCY, [
{[{module, '*'}, {foo, '*'}], config_to_mask(emergency), foo},
{[{module, '*'}], config_to_mask(emergency), bar}], [])),
{[{module, '*'}, {foo, '*'}], configToMask(emergency), foo},
{[{module, '*'}], configToMask(emergency), bar}], [])),
%% denied by level %% denied by level
?assertEqual([], check_traces([{module, ?MODULE}, {foo, bar}], ?INFO, [ ?assertEqual([], check_traces([{module, ?MODULE}, {foo, bar}], ?INFO, [
{[{module, '*'}, {foo, '*'}], config_to_mask(emergency), foo},
{[{module, '*'}], config_to_mask(emergency), bar}], [])),
{[{module, '*'}, {foo, '*'}], configToMask(emergency), foo},
{[{module, '*'}], configToMask(emergency), bar}], [])),
%% allowed by level %% allowed by level
?assertEqual([foo], check_traces([{module, ?MODULE}, {foo, bar}], ?INFO, [ ?assertEqual([foo], check_traces([{module, ?MODULE}, {foo, bar}], ?INFO, [
{[{module, '*'}, {foo, '*'}], config_to_mask(debug), foo},
{[{module, '*'}], config_to_mask(emergency), bar}], [])),
{[{module, '*'}, {foo, '*'}], configToMask(debug), foo},
{[{module, '*'}], configToMask(emergency), bar}], [])),
?assertEqual([anythingbutnotice, infoandbelow, infoonly], check_traces([{module, ?MODULE}], ?INFO, [ ?assertEqual([anythingbutnotice, infoandbelow, infoonly], check_traces([{module, ?MODULE}], ?INFO, [
{[{module, '*'}], config_to_mask('=debug'), debugonly},
{[{module, '*'}], config_to_mask('=info'), infoonly},
{[{module, '*'}], config_to_mask('<=info'), infoandbelow},
{[{module, '*'}], config_to_mask('!=info'), anythingbutinfo},
{[{module, '*'}], config_to_mask('!=notice'), anythingbutnotice}
{[{module, '*'}], configToMask('=debug'), debugonly},
{[{module, '*'}], configToMask('=info'), infoonly},
{[{module, '*'}], configToMask('<=info'), infoandbelow},
{[{module, '*'}], configToMask('!=info'), anythingbutinfo},
{[{module, '*'}], configToMask('!=notice'), anythingbutnotice}
], [])), ], [])),
application:stop(lager), application:stop(lager),
application:stop(goldrush), application:stop(goldrush),
@ -778,11 +769,11 @@ check_trace_test() ->
is_loggable_test_() -> is_loggable_test_() ->
[ [
{"Loggable by severity only", ?_assert(is_loggable(rumMsg:new("", alert, [], []), 2, me))},
{"Not loggable by severity only", ?_assertNot(is_loggable(rumMsg:new("", critical, [], []), 1, me))},
{"Loggable by severity with destination", ?_assert(is_loggable(rumMsg:new("", alert, [], [you]), 2, me))},
{"Not loggable by severity with destination", ?_assertNot(is_loggable(rumMsg:new("", critical, [], [you]), 1, me))},
{"Loggable by destination overriding severity", ?_assert(is_loggable(rumMsg:new("", critical, [], [me]), 1, me))}
{"Loggable by severity only", ?_assert(isLoggAble(rumMsg:new("", alert, [], []), 2, me))},
{"Not loggable by severity only", ?_assertNot(isLoggAble(rumMsg:new("", critical, [], []), 1, me))},
{"Loggable by severity with destination", ?_assert(isLoggAble(rumMsg:new("", alert, [], [you]), 2, me))},
{"Not loggable by severity with destination", ?_assertNot(isLoggAble(rumMsg:new("", critical, [], [you]), 1, me))},
{"Loggable by destination overriding severity", ?_assert(isLoggAble(rumMsg:new("", critical, [], [me]), 1, me))}
]. ].
format_time_test_() -> format_time_test_() ->
@ -816,7 +807,7 @@ format_time_test_() ->
config_to_levels_test() -> config_to_levels_test() ->
?assertEqual([none], atomCfgToLevels('none')), ?assertEqual([none], atomCfgToLevels('none')),
?assertEqual({mask, 0}, config_to_mask('none')),
?assertEqual(0, configToMask('none')),
?assertEqual([debug], atomCfgToLevels('=debug')), ?assertEqual([debug], atomCfgToLevels('=debug')),
?assertEqual([debug], atomCfgToLevels('<info')), ?assertEqual([debug], atomCfgToLevels('<info')),
?assertEqual(levels() -- [debug], atomCfgToLevels('!=debug')), ?assertEqual(levels() -- [debug], atomCfgToLevels('!=debug')),
@ -837,10 +828,10 @@ config_to_levels_test() ->
ok. ok.
config_to_mask_test() -> config_to_mask_test() ->
?assertEqual({mask, 0}, config_to_mask('none')),
?assertEqual({mask, ?DEBUG bor ?INFO bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY}, config_to_mask('debug')),
?assertEqual({mask, ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY}, config_to_mask('warning')),
?assertEqual({mask, ?DEBUG bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY}, config_to_mask('!=info')),
?assertEqual(0, configToMask('none')),
?assertEqual(?DEBUG bor ?INFO bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY, configToMask('debug')),
?assertEqual(?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY, configToMask('warning')),
?assertEqual(?DEBUG bor ?NOTICE bor ?WARNING bor ?ERROR bor ?CRITICAL bor ?ALERT bor ?EMERGENCY, configToMask('!=info')),
ok. ok.
mask_to_levels_test() -> mask_to_levels_test() ->

+ 1
- 1
test/lager_slow_backend.erl 查看文件

@ -14,7 +14,7 @@ init([{delay, Delay}]) ->
{ok, #state{delay = Delay}}. {ok, #state{delay = Delay}}.
handle_call(mGetLogLevel, State) -> handle_call(mGetLogLevel, State) ->
{ok, rumUtil:config_to_mask(debug), State};
{ok, rumUtil:configToMask(debug), State};
handle_call(_Request, State) -> handle_call(_Request, State) ->
{ok, ok, State}. {ok, ok, State}.

Loading…
取消
儲存