Browse Source

ft: rumFormatTer相关整理

master
SisMaker 4 years ago
parent
commit
bdd2683dda
9 changed files with 184 additions and 206 deletions
  1. +8
    -8
      eRum.sample.config
  2. +1
    -1
      include/rumDef.hrl
  3. +2
    -1
      src/backend/rumBkdConsole.erl
  4. +0
    -2
      src/eRum_app.erl
  5. +2
    -0
      src/eRum_sup.erl
  6. +167
    -144
      src/formatter/rumFormatTer.erl
  7. +0
    -46
      src/utils/rumMsg.erl
  8. +4
    -3
      src/utils/rumUtil.erl
  9. +0
    -1
      src/watcher/rumHWatcherSrv.erl

+ 8
- 8
eRum.sample.config View File

@ -5,14 +5,14 @@
{colored, false},
%% 颜色码配置
{colors, [
{debug, "\e[0;38m"},
{info, "\e[1;37m"},
{notice, "\e[1;36m"},
{warning, "\e[1;33m"},
{error, "\e[1;31m"},
{critical, "\e[1;35m"},
{alert, "\e[1;44m"},
{emergency, "\e[1;41m"}
{debug, &lt;<&#34;\e[0;38m";>>;},
{info, &lt;<&#34;\e[1;37m";>>;},
{notice, &lt;<&#34;\e[1;36m";>>;},
{warning, &lt;<&#34;\e[1;33m";>>;},
{error, &lt;<&#34;\e[1;31m";>>;},
{critical, &lt;<&#34;\e[1;35m";>>;},
{alert, &lt;<&#34;\e[1;44m";>>;},
{emergency, &lt;<&#34;\e[1;41m";>>;}
]},
%% ******************************************** format相关 ******************************************************

+ 1
- 1
include/rumDef.hrl View File

@ -121,7 +121,7 @@
-define(RunShouldLog(Sink, Level), (rumUtil:levelToNum(Level) band ?eRumCfg:get(Sink)) /= 0).
-define(RunShouldLog(Level), (rumUtil:levelToNum(Level) band rumConfig:get(?RumDefSink)) /= 0).
-define(RunShouldLog(Level), (rumUtil:levelToNum(Level) band ?eRumCfg:get(?RumDefSink)) /= 0).
-define(RunNotify(Level, Pid, Format, Args),
gen_emm:info_notify(?RumDefSink, {mWriteLog, #rumMsg{severity = Level, pid = Pid, node = node(), module = ?MODULE, function = ?FUNCTION_NAME, line = ?LINE, metadata = [], datetime = rumUtil:msToBinStr(), timestamp = rumTime:nowMs(), message = eFmt:formatBin(Format, Args), destinations = []}})).

+ 2
- 1
src/backend/rumBkdConsole.erl View File

@ -49,7 +49,8 @@ init(Opts) ->
{error, {fatal, old_shell}};
_ ->
true = checkOpts(Opts),
Colors = ?IIF(rumUtil:get_env(colored, false), rumUtil:get_env(colors, []), []),
CfgColors = ?IIF(rumUtil:get_env(colored, false), rumUtil:get_env(colors, []), []),
Colors = [{rumUtil:levelToNum(Level), ColorStr} || {Level, ColorStr} <- CfgColors],
Level = rumUtil:get_opt(level, Opts, undefined),
LevelMask = rumUtil:configToMask(Level),
[UseErr, GroupLeader, Id, FormatTer, FormatCfg] = [rumUtil:get_opt(Key, Opts, Def) || {Key, Def} <- ?RumDefConsoleOpts],

+ 0
- 2
src/eRum_app.erl View File

@ -4,7 +4,6 @@
-include("rumCom.hrl").
-include("rumDef.hrl").
-include("eRum.hrl").
-export([
start/2
@ -20,7 +19,6 @@ start(_StartType, _StartArgs) ->
SavedHandlers = doStart(),
doStartExtraSink(),
doStartTraces(),
?eRumInit(),
{ok, Pid, SavedHandlers}.
%% (sink)

+ 2
- 0
src/eRum_sup.erl View File

@ -2,6 +2,7 @@
-behaviour(supervisor).
-include("eRum.hrl").
-include("rumDef.hrl").
-export([
@ -36,6 +37,7 @@ init(_Args) ->
%% set up the config, is safe even during relups
%% IMY-TODO
rumConfig:init(),
?eRumInit(),
%%runEvent作为默认值启动gen_event东西也许是一个用于处理接收器及其策略的新API
SupFlags =
#{

+ 167
- 144
src/formatter/rumFormatTer.erl View File

@ -21,8 +21,18 @@
%% or refer to other properties, if desired. You can also use a {atom, semi-iolist(), semi-iolist()} formatTer, which
%% acts like a ternary operator's true/false branches.
%%
%% The metadata properties date,time, message, severity, and sev will always exist.
%% The properties pid, file, line, module, and function will always exist if the parser transform is used.
%% The metadata properties datetime, message, severity, pid, line, module, and function will always exist.
%% @doc使用半ioiolist作为配置为日志消息提供通用的默认格式iolist配置中的
%%
%%使{atomsemi-iolist}
%%使semi-iolist广
%%使{atomsemi-iolistsemi-iolist} formatTer
%%true / false分支
%%
%%
%%使pid
%%
%% Example:
%%
@ -34,173 +44,148 @@
%%
%% `[{pid, ["My pid is ", pid], ["Unknown Pid"]}]' -> if pid is in the metada print "My pid is ?.?.?", otherwise print "Unknown Pid"
%% @end
-spec format(rumMsg:rumMsg(), list(), list()) -> any().
format(Msg, [], Colors) ->
format(Msg, [{eol, "\n"}], Colors);
format(Msg, [{eol, EOL}], Colors) ->
-spec format(rumMsg(), list()) -> any().
format(RumMsg, Config) ->
[output(V, RumMsg) || V <- Config].
-spec format(rumMsg(), list(), list()) -> any().
format(RumMsg, [], Colors) ->
format(RumMsg, [{eol, "\n"}], Colors);
format(RumMsg, [{eol, EOL}], Colors) ->
Config =
case rumUtil:get_env(metadataWhitelist, undefined) of
undefined -> config(EOL, []);
Whitelist -> config(EOL, Whitelist)
end,
format(Msg, Config, Colors);
format(Message, Config, Colors) ->
format(RumMsg, Config, Colors);
format(RumMsg, Config, Colors) ->
[
case V of
color -> output_color(Message, Colors);
_ -> output(V, Message)
color -> outColor(Colors, RumMsg);
_ -> output(V, RumMsg)
end || V <- Config
].
-spec format(rumMsg:rumMsg(), list()) -> any().
format(Msg, Config) ->
format(Msg, Config, []).
-spec output(term(), rumMsg:rumMsg()) -> iolist().
output(message, Msg) -> rumMsg:message(Msg);
output(datetime, Msg) ->
rumMsg:datetime(Msg);
output(severity, Msg) ->
atom_to_list(rumMsg:severity(Msg));
output(severity_upper, Msg) ->
uppercase_severity(rumMsg:severity(Msg));
output(blank, _Msg) ->
output({blank, " "}, _Msg);
output(node, _Msg) ->
output({node, atom_to_list(node())}, _Msg);
output({blank, Fill}, _Msg) ->
Fill;
output(sev, Msg) ->
%% Write brief acronym for the severity level (e.g. debug -> $D)
[rumUtil:levelToChr(rumMsg:severity(Msg))];
output(metadata, Msg) ->
output({metadata, "=", " "}, Msg);
output({metadata, IntSep, FieldSep}, Msg) ->
MD = lists:keysort(1, rumMsg:metadata(Msg)),
string:join([io_lib:format("~s~s~p", [K, IntSep, V]) || {K, V} <- MD], FieldSep);
output({pterm, Key}, Msg) ->
output({pterm, Key, ""}, Msg);
output({pterm, Key, Default}, _Msg) ->
make_printable(maybe_get_persistent_term(Key, Default));
output(Prop, Msg) when is_atom(Prop) ->
Metadata = rumMsg:metadata(Msg),
make_printable(get_metadata(Prop, Metadata, <<"Undefined">>));
output({Prop, Default}, Msg) when is_atom(Prop) ->
Metadata = rumMsg:metadata(Msg),
make_printable(get_metadata(Prop, Metadata, output(Default, Msg)));
output({Prop, Present, Absent}, Msg) when is_atom(Prop) ->
%% sort of like a poor man's ternary operator
Metadata = rumMsg:metadata(Msg),
case get_metadata(Prop, Metadata) of
-spec output(term(), rumMsg()) -> iolist().
output(message, RumMsg) -> RumMsg#rumMsg.message;
output(datetime, RumMsg) -> RumMsg#rumMsg.datetime;
output(module, RumMsg) -> atom_to_binary(RumMsg#rumMsg.module, utf8);
output(function, RumMsg) -> atom_to_binary(RumMsg#rumMsg.function, utf8);
output(line, RumMsg) -> integer_to_binary(RumMsg#rumMsg.line);
output(severity, RumMsg) -> loSeverity(RumMsg#rumMsg.severity);
output(upSeverity, RumMsg) -> upSeverity(RumMsg#rumMsg.severity);
output(blank, _RumMsg) -> <<" ">>;
output(node, RumMsg) -> atom_to_binary(RumMsg#rumMsg.node, utf8);
output(sev, RumMsg) -> sevSeverity(RumMsg#rumMsg.severity); %% Write brief acronym for the severity level (e.g. debug -> $D)
output(metadata, RumMsg) -> mdJoin(RumMsg#rumMsg.metadata, <<"|">>, <<>>);
output({blank, Fill}, _RumMsg) -> Fill;
output({metadata, IntSep, FieldSep}, RumMsg) ->
MD = lists:keysort(1, RumMsg#rumMsg.metadata), mdJoin(MD, IntSep, FieldSep, <<>>);
output({pterm, Key}, _RumMsg) ->
makeStr(getPTerm(Key, <<"">>));
output({pterm, Key, Default}, _RumMsg) ->
makeStr(getPTerm(Key, Default));
output(Prop, RumMsg) when is_atom(Prop) ->
makeStr(getMdKey(Prop, RumMsg#rumMsg.metadata, <<"Undefined">>));
output({Prop, Default}, RumMsg) when is_atom(Prop) ->
makeStr(getMdKey(Prop, RumMsg#rumMsg.metadata, output(Default, RumMsg)));
output({Prop, Present, Absent}, RumMsg) when is_atom(Prop) ->
case getMdKey(Prop, RumMsg#rumMsg.metadata) of
undefined ->
[output(V, Msg) || V <- Absent];
[output(V, RumMsg) || V <- Absent];
_ ->
[output(V, Msg) || V <- Present]
[output(V, RumMsg) || V <- Present]
end;
output({Prop, Present, Absent, Width}, Msg) when is_atom(Prop) ->
output({Prop, Present, Absent, Width}, RumMsg) when is_atom(Prop) ->
%% sort of like a poor man's ternary operator
Metadata = rumMsg:metadata(Msg),
case get_metadata(Prop, Metadata) of
case getMdKey(Prop, RumMsg#rumMsg.metadata) of
undefined ->
[output(V, Msg, Width) || V <- Absent];
[output(V, RumMsg, Width) || V <- Absent];
_ ->
[output(V, Msg, Width) || V <- Present]
[output(V, RumMsg, Width) || V <- Present]
end;
output(Other, _) -> make_printable(Other).
output(message, Msg, _Width) -> rumMsg:message(Msg);
output(datetime, Msg, _Width) ->
rumMsg:datetime(Msg);
output(severity, Msg, Width) ->
make_printable(atom_to_list(rumMsg:severity(Msg)), Width);
output(sev, Msg, _Width) ->
%% Write brief acronym for the severity level (e.g. debug -> $D)
[rumUtil:levelToChr(rumMsg:severity(Msg))];
output(node, Msg, _Width) ->
output({node, atom_to_list(node())}, Msg, _Width);
output(blank, _Msg, _Width) ->
output({blank, " "}, _Msg, _Width);
output({blank, Fill}, _Msg, _Width) ->
Fill;
output(metadata, Msg, _Width) ->
output({metadata, "=", " "}, Msg, _Width);
output({metadata, IntSep, FieldSep}, Msg, _Width) ->
MD = lists:keysort(1, rumMsg:metadata(Msg)),
[string:join([io_lib:format("~s~s~p", [K, IntSep, V]) || {K, V} <- MD], FieldSep)];
output({pterm, Key}, Msg, Width) ->
output({pterm, Key, ""}, Msg, Width);
output({pterm, Key, Default}, _Msg, _Width) ->
make_printable(maybe_get_persistent_term(Key, Default));
output(Prop, Msg, Width) when is_atom(Prop) ->
Metadata = rumMsg:metadata(Msg),
make_printable(get_metadata(Prop, Metadata, <<"Undefined">>), Width);
output({Prop, Default}, Msg, Width) when is_atom(Prop) ->
Metadata = rumMsg:metadata(Msg),
make_printable(get_metadata(Prop, Metadata, output(Default, Msg)), Width);
output(Other, _, Width) -> make_printable(Other, Width).
output_color(_Msg, []) -> [];
output_color(Msg, Colors) ->
Level = rumMsg:severity(Msg),
case lists:keyfind(Level, 1, Colors) of
output(Other, _) -> makeStr(Other).
output(message, RumMsg, _Width) -> RumMsg#rumMsg.message;
output(datetime, RumMsg, _Width) -> RumMsg#rumMsg.datetime;
output(module, RumMsg, _Width) -> atom_to_binary(RumMsg#rumMsg.module, utf8);
output(function, RumMsg, _Width) -> atom_to_binary(RumMsg#rumMsg.function, utf8);
output(line, RumMsg, _Width) -> integer_to_binary(RumMsg#rumMsg.line);
output(severity, RumMsg, _Width) -> loSeverity(RumMsg#rumMsg.severity);
output(upSeverity, RumMsg, _Width) -> upSeverity(RumMsg#rumMsg.severity);
output(blank, _RumMsg, _Width) -> <<" ">>;
output(node, RumMsg, _Width) -> atom_to_binary(RumMsg#rumMsg.node, utf8);
output(sev, RumMsg, _Width) -> sevSeverity(RumMsg#rumMsg.severity); %% Write brief acronym for the severity level (e.g. debug -> $D)
output({blank, Fill}, _RumMsg, _Width) -> Fill;
output(metadata, RumMsg, _Width) -> mdJoin(RumMsg#rumMsg.metadata, <<"|">>, <<>>);
output({metadata, IntSep, FieldSep}, RumMsg, _Width) ->
MD = lists:keysort(1, RumMsg#rumMsg.metadata), mdJoin(MD, IntSep, FieldSep, <<>>);
output({pterm, Key}, _RumMsg, _Width) -> makeStr(getPTerm(Key, <<"">>));
output({pterm, Key, Default}, _RumMsg, _Width) -> makeStr(getPTerm(Key, Default));
output(Prop, RumMsg, Width) when is_atom(Prop) ->
makeStr(getMdKey(Prop, RumMsg#rumMsg.metadata, <<"Undefined">>), Width);
output({Prop, Default}, RumMsg, Width) when is_atom(Prop) ->
makeStr(getMdKey(Prop, RumMsg#rumMsg.metadata, output(Default, RumMsg)), Width);
output(Other, _, Width) -> makeStr(Other, Width).
outColor([], _RumMsg) -> <<>>;
outColor(Colors, RumMsg) ->
case lists:keyfind(RumMsg#rumMsg.severity, 1, Colors) of
{_, Color} -> Color;
_ -> []
_ -> <<>>
end.
-spec make_printable(any()) -> iolist().
make_printable(A) when is_atom(A) -> atom_to_list(A);
make_printable(P) when is_pid(P) -> pid_to_list(P);
make_printable(L) when is_list(L) orelse is_binary(L) -> L;
make_printable(Other) -> io_lib:format("~p", [Other]).
make_printable(A, W) when is_integer(W) -> string:left(make_printable(A), W);
make_printable(A, {Align, W}) when is_integer(W) ->
case Align of
left ->
string:left(make_printable(A), W);
centre ->
string:centre(make_printable(A), W);
right ->
string:right(make_printable(A), W);
_ ->
string:left(make_printable(A), W)
end;
-spec makeStr(any()) -> iolist().
makeStr(A) when is_atom(A) -> atom_to_binary(A);
makeStr(P) when is_pid(P) -> list_to_binary(pid_to_list(P));
makeStr(B) when is_binary(B) -> B;
makeStr(Other) -> eFmt:formatBin("~p", [Other]).
makeList(A) when is_atom(A) -> atom_to_list(A);
makeList(P) when is_pid(P) -> pid_to_list(P);
makeList(Other) -> binary_to_list(eFmt:formatBin("~p", [Other])).
makeStr(A, W) when is_integer(W) -> makeStr(left, makeList(A), W);
makeStr(A, {Align, W}) when is_integer(W) ->
makeStr(Align, makeList(A), W);
makeStr(A, _W) -> makeStr(A).
make_printable(A, _W) -> make_printable(A).
makeStr(left, Str, W) ->
list_to_binary(string:left(Str, W));
makeStr(centre, Str, W) ->
list_to_binary(string:centre(Str, W));
makeStr(right, Str, W) ->
list_to_binary(string:right(Str, W));
makeStr(_, Str, W) ->
list_to_binary(string:left(Str, W)).
%% persistent term was introduced in OTP 21.2, so
%% if we're running on an older OTP, just return the
%% default value.
maybe_get_persistent_term(Key, Default) ->
try
persistent_term:get(Key, Default)
catch
_:undef -> Default
end.
getPTerm(Key, Default) ->
persistent_term:get(Key, Default).
run_function(Function, Default) ->
try Function() of
Result ->
Result
catch
_:_ ->
Default
end.
getMdKey(Key, Metadata) ->
getMdKey(Key, Metadata, undefined).
get_metadata(Key, Metadata) ->
get_metadata(Key, Metadata, undefined).
get_metadata(Key, Metadata, Default) ->
getMdKey(Key, Metadata, Default) ->
case lists:keyfind(Key, 1, Metadata) of
false ->
Default;
{Key, Value} when is_function(Value) ->
run_function(Value, Default);
{Key, Value} ->
{_Key, Fun} when is_function(Fun) ->
runFun(Fun, Default);
{_Key, Value} ->
Value
end.
runFun(Fun, Default) ->
try Fun()
catch
_:_ ->
Default
end.
config(EOL, []) ->
[
datetime, " ", color, "[", severity, "] ",
@ -226,13 +211,51 @@ config(EOL, MetaWhitelist) ->
[{M, [atom_to_list(M), "=", M, " "], ""} || M <- MetaWhitelist] ++
[message, EOL].
loSeverity(?debug) -> <<"debug">>;
loSeverity(?info) -> <<"info">>;
loSeverity(?notice) -> <<"notice">>;
loSeverity(?warning) -> <<"warning">>;
loSeverity(?error) -> <<"error">>;
loSeverity(?critical) -> <<"critical">>;
loSeverity(?alert) -> <<"alert">>;
loSeverity(?emergency) -> <<"emergency">>;
loSeverity(?none) -> <<"none">>.
upSeverity(?debug) -> <<"DEBUG">>;
upSeverity(?info) -> <<"INFO">>;
upSeverity(?notice) -> <<"NOTICE">>;
upSeverity(?warning) -> <<"WARNING">>;
upSeverity(?error) -> <<"ERROR">>;
upSeverity(?critical) -> <<"CRITICAL">>;
upSeverity(?alert) -> <<"ALERT">>;
upSeverity(?emergency) -> <<"EMERGENCY">>;
upSeverity(?none) -> <<"NONE">>.
sevSeverity(?debug) -> <<"[D]">>;
sevSeverity(?info) -> <<"[I]">>;
sevSeverity(?notice) -> <<"[N]">>;
sevSeverity(?warning) -> <<"[W]">>;
sevSeverity(?error) -> <<"[E]">>;
sevSeverity(?critical) -> <<"[C]">>;
sevSeverity(?alert) -> <<"[A]">>;
sevSeverity(?emergency) -> <<"[E]">>;
sevSeverity(?none) -> <<"[o]">>.
mdJoin([], _FieldSep, BinAcc) ->
BinAcc;
mdJoin([{_K, V}], _FieldSep, BinAcc) ->
<<BinAcc/binary, (eFmt:formatBin("~p", [V]))/binary>>;
mdJoin([{_K, V} | Left], FieldSep, BinAcc) ->
mdJoin(Left, FieldSep, <<BinAcc/binary, (eFmt:formatBin("~p", [V]))/binary, FieldSep/binary>>).
mdJoin([], _IntSep, _FieldSep, BinAcc) ->
BinAcc;
mdJoin([{K, V}], IntSep, _FieldSep, BinAcc) ->
<<BinAcc/binary, (eFmt:formatBin("~p~s~p", [K, IntSep, V]))/binary>>;
mdJoin([{K, V} | Left], IntSep, FieldSep, BinAcc) ->
mdJoin(Left, FieldSep, <<BinAcc/binary, (eFmt:formatBin("~p~s~p", [K, IntSep, V]))/binary, FieldSep/binary>>).
uppercase_severity(debug) -> "DEBUG";
uppercase_severity(info) -> "INFO";
uppercase_severity(notice) -> "NOTICE";
uppercase_severity(warning) -> "WARNING";
uppercase_severity(error) -> "ERROR";
uppercase_severity(critical) -> "CRITICAL";
uppercase_severity(alert) -> "ALERT";
uppercase_severity(emergency) -> "EMERGENCY".

+ 0
- 46
src/utils/rumMsg.erl View File

@ -1,46 +0,0 @@
-module(rumMsg).
-include("rumDef.hrl").
-export([new/4, new/5]).
-export([message/1]).
-export([timestamp/1]).
-export([datetime/1]).
-export([severity/1]).
-export([severity_as_int/1]).
-export([metadata/1]).
-export([destinations/1]).
%% create with provided timestamp, handy for testing mostly
new(Msg, MsTick, Severity, Metadata, Destinations) ->
TimeBinStr = rumUtil:msToBinStr(MsTick),
#rumMsg{message = Msg, datetime = TimeBinStr, timestamp = MsTick, severity = Severity,
metadata = Metadata, destinations = Destinations}.
new(Msg, Severity, Metadata, Destinations) ->
NowMs = rumUtil:nowMs(),
new(Msg, NowMs, Severity, Metadata, Destinations).
message(Msg) ->
Msg#rumMsg.message.
timestamp(Msg) ->
Msg#rumMsg.timestamp.
datetime(Msg) ->
Msg#rumMsg.datetime.
severity(Msg) ->
Msg#rumMsg.severity.
severity_as_int(Msg) ->
rumUtil:levelToNum(Msg#rumMsg.severity).
metadata(Msg) ->
Msg#rumMsg.metadata.
destinations(Msg) ->
Msg#rumMsg.destinations.

+ 4
- 3
src/utils/rumUtil.erl View File

@ -477,9 +477,10 @@ check_trace(Attrs, {Filter, _Level, Dest}) when is_tuple(Filter) ->
[]
end.
-spec isLoggAble(rumMsg:rumMsg(), rumMaskLevel(), term()) -> boolean().
isLoggAble(Msg, Mask, MyName) ->
(rumMsg:severity_as_int(Msg) band Mask) /= 0 orelse lists:member(MyName, rumMsg:destinations(Msg)).
-spec isLoggAble(rumMsg(), rumMaskLevel(), term()) -> boolean().
isLoggAble(RumMsg, Mask, MyName) ->
#rumMsg{severity = Severity, destinations = Destinations} = RumMsg,
(Severity band Mask) /= 0 orelse lists:member(MyName, Destinations).
parsePath(RelPath) ->
NewRelPath =

+ 0
- 1
src/watcher/rumHWatcherSrv.erl View File

@ -92,7 +92,6 @@ code_change(_OldVsn, State, _Extra) ->
{ok, State}.
installHandler(Module, Config, Sink) ->
Ret =
case Module of
rumErrLoggerH ->

Loading…
Cancel
Save