Merge pull request #6448 from zhongwencool/log-trace-clientid-utf8
fix: trace not work if clientid is utf8
This commit is contained in:
commit
4af36ed744
|
@ -59,6 +59,22 @@
|
||||||
}}
|
}}
|
||||||
).
|
).
|
||||||
|
|
||||||
|
-define(CLIENT_FORMAT,
|
||||||
|
{logger_formatter, #{
|
||||||
|
template => [
|
||||||
|
time, " [", level, "] ",
|
||||||
|
{clientid,
|
||||||
|
[{peername, [clientid, "@", peername, " "], [clientid, " "]}],
|
||||||
|
[{peername, [peername, " "], []}]
|
||||||
|
},
|
||||||
|
msg, "\n"
|
||||||
|
],
|
||||||
|
single_line => false,
|
||||||
|
max_size => unlimited,
|
||||||
|
depth => unlimited
|
||||||
|
}}
|
||||||
|
).
|
||||||
|
|
||||||
-define(CONFIG(_LogFile_), #{
|
-define(CONFIG(_LogFile_), #{
|
||||||
type => halt,
|
type => halt,
|
||||||
file => _LogFile_,
|
file => _LogFile_,
|
||||||
|
@ -160,7 +176,7 @@ filter_ip_address(_Log, _ExpectId) -> ignore.
|
||||||
install_handler(Who = #{name := Name, type := Type}, Level, LogFile) ->
|
install_handler(Who = #{name := Name, type := Type}, Level, LogFile) ->
|
||||||
HandlerId = handler_id(Name, Type),
|
HandlerId = handler_id(Name, Type),
|
||||||
Config = #{ level => Level,
|
Config = #{ level => Level,
|
||||||
formatter => ?FORMAT,
|
formatter => formatter(Who),
|
||||||
filter_default => stop,
|
filter_default => stop,
|
||||||
filters => filters(Who),
|
filters => filters(Who),
|
||||||
config => ?CONFIG(LogFile)
|
config => ?CONFIG(LogFile)
|
||||||
|
@ -176,6 +192,31 @@ filters(#{type := topic, filter := Filter, name := Name}) ->
|
||||||
filters(#{type := ip_address, filter := Filter, name := Name}) ->
|
filters(#{type := ip_address, filter := Filter, name := Name}) ->
|
||||||
[{ip_address, {fun ?MODULE:filter_ip_address/2, {ensure_list(Filter), Name}}}].
|
[{ip_address, {fun ?MODULE:filter_ip_address/2, {ensure_list(Filter), Name}}}].
|
||||||
|
|
||||||
|
formatter(#{type := Type}) ->
|
||||||
|
{logger_formatter,
|
||||||
|
#{
|
||||||
|
template => template(Type),
|
||||||
|
single_line => false,
|
||||||
|
max_size => unlimited,
|
||||||
|
depth => unlimited
|
||||||
|
}
|
||||||
|
}.
|
||||||
|
|
||||||
|
%% Don't log clientid since clientid only supports exact match, all client ids are the same.
|
||||||
|
%% if clientid is not latin characters. the logger_formatter restricts the output must be `~tp`
|
||||||
|
%% (actually should use `~ts`), the utf8 characters clientid will become very difficult to read.
|
||||||
|
template(clientid) ->
|
||||||
|
[time, " [", level, "] ", {peername, [peername, " "], []}, msg, "\n"];
|
||||||
|
%% TODO better format when clientid is utf8.
|
||||||
|
template(_) ->
|
||||||
|
[ time, " [", level, "] ",
|
||||||
|
{clientid,
|
||||||
|
[{peername, [clientid, "@", peername, " "], [clientid, " "]}],
|
||||||
|
[{peername, [peername, " "], []}]
|
||||||
|
},
|
||||||
|
msg, "\n"
|
||||||
|
].
|
||||||
|
|
||||||
filter_traces(#{id := Id, level := Level, dst := Dst, filters := Filters}, Acc) ->
|
filter_traces(#{id := Id, level := Level, dst := Dst, filters := Filters}, Acc) ->
|
||||||
Init = #{id => Id, level => Level, dst => Dst},
|
Init = #{id => Id, level => Level, dst => Dst},
|
||||||
case Filters of
|
case Filters of
|
||||||
|
@ -209,7 +250,7 @@ do_handler_id(Name, Type) ->
|
||||||
ensure_bin(List) when is_list(List) -> iolist_to_binary(List);
|
ensure_bin(List) when is_list(List) -> iolist_to_binary(List);
|
||||||
ensure_bin(Bin) when is_binary(Bin) -> Bin.
|
ensure_bin(Bin) when is_binary(Bin) -> Bin.
|
||||||
|
|
||||||
ensure_list(Bin) when is_binary(Bin) -> binary_to_list(Bin);
|
ensure_list(Bin) when is_binary(Bin) -> unicode:characters_to_list(Bin, utf8);
|
||||||
ensure_list(List) when is_list(List) -> List.
|
ensure_list(List) when is_list(List) -> List.
|
||||||
|
|
||||||
show_prompts(ok, Who, Msg) ->
|
show_prompts(ok, Who, Msg) ->
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
{password, <<"pass">>}
|
{password, <<"pass">>}
|
||||||
]).
|
]).
|
||||||
|
|
||||||
all() -> [t_trace_clientid, t_trace_topic, t_trace_ip_address].
|
all() -> [t_trace_clientid, t_trace_topic, t_trace_ip_address, t_trace_clientid_utf8].
|
||||||
|
|
||||||
init_per_suite(Config) ->
|
init_per_suite(Config) ->
|
||||||
emqx_ct_helpers:boot_modules(all),
|
emqx_ct_helpers:boot_modules(all),
|
||||||
|
@ -105,6 +105,22 @@ t_trace_clientid(_Config) ->
|
||||||
emqtt:disconnect(T),
|
emqtt:disconnect(T),
|
||||||
?assertEqual([], emqx_trace_handler:running()).
|
?assertEqual([], emqx_trace_handler:running()).
|
||||||
|
|
||||||
|
t_trace_clientid_utf8(_) ->
|
||||||
|
emqx_logger:set_log_level(debug),
|
||||||
|
|
||||||
|
Utf8Id = <<"client 漢字編碼"/utf8>>,
|
||||||
|
ok = emqx_trace_handler:install(clientid, Utf8Id, debug, "tmp/client-utf8.log"),
|
||||||
|
{ok, T} = emqtt:start_link([{clientid, Utf8Id}]),
|
||||||
|
emqtt:connect(T),
|
||||||
|
[begin emqtt:publish(T, <<"a/b/c">>, <<"hi">>) end|| _ <- lists:seq(1, 10)],
|
||||||
|
emqtt:ping(T),
|
||||||
|
|
||||||
|
ok = filesync(Utf8Id, clientid),
|
||||||
|
ok = emqx_trace_handler:uninstall(clientid, Utf8Id),
|
||||||
|
emqtt:disconnect(T),
|
||||||
|
?assertEqual([], emqx_trace_handler:running()),
|
||||||
|
ok.
|
||||||
|
|
||||||
t_trace_topic(_Config) ->
|
t_trace_topic(_Config) ->
|
||||||
{ok, T} = emqtt:start_link(?CLIENT),
|
{ok, T} = emqtt:start_link(?CLIENT),
|
||||||
emqtt:connect(T),
|
emqtt:connect(T),
|
||||||
|
|
Loading…
Reference in New Issue