fix(json trace format): use best_effort_json instead of new encoder
This commit is contained in:
parent
aa39835242
commit
968dc2ccda
|
@ -199,9 +199,6 @@ filters(#{type := ruleid, filter := Filter, name := Name}) ->
|
||||||
|
|
||||||
formatter(#{type := _Type, payload_encode := PayloadEncode, formatter := json}) ->
|
formatter(#{type := _Type, payload_encode := PayloadEncode, formatter := json}) ->
|
||||||
{emqx_trace_json_formatter, #{
|
{emqx_trace_json_formatter, #{
|
||||||
single_line => true,
|
|
||||||
max_size => unlimited,
|
|
||||||
depth => unlimited,
|
|
||||||
payload_encode => PayloadEncode
|
payload_encode => PayloadEncode
|
||||||
}};
|
}};
|
||||||
formatter(#{type := _Type, payload_encode := PayloadEncode}) ->
|
formatter(#{type := _Type, payload_encode := PayloadEncode}) ->
|
||||||
|
|
|
@ -33,78 +33,45 @@ format(
|
||||||
LogMap,
|
LogMap,
|
||||||
#{payload_encode := PEncode}
|
#{payload_encode := PEncode}
|
||||||
) ->
|
) ->
|
||||||
|
%% We just make some basic transformations on the input LogMap and then do
|
||||||
|
%% an external call to create the JSON text
|
||||||
Time = emqx_utils_calendar:now_to_rfc3339(microsecond),
|
Time = emqx_utils_calendar:now_to_rfc3339(microsecond),
|
||||||
LogMap1 = LogMap#{time => Time},
|
LogMap1 = LogMap#{time => Time},
|
||||||
[format_log_map(LogMap1, PEncode), "\n"].
|
LogMap2 = prepare_log_map(LogMap1, PEncode),
|
||||||
|
[emqx_logger_jsonfmt:best_effort_json(LogMap2, [force_utf8]), "\n"].
|
||||||
|
|
||||||
%%%-----------------------------------------------------------------
|
%%%-----------------------------------------------------------------
|
||||||
%%% Helper Functions
|
%%% Helper Functions
|
||||||
%%%-----------------------------------------------------------------
|
%%%-----------------------------------------------------------------
|
||||||
|
|
||||||
format_log_map(Map, PEncode) ->
|
prepare_log_map(LogMap, PEncode) when is_map(LogMap) ->
|
||||||
KeyValuePairs = format_key_value_pairs(maps:to_list(Map), PEncode, []),
|
NewKeyValuePairs = [prepare_key_value(K, V, PEncode) || {K, V} <- maps:to_list(LogMap)],
|
||||||
["{", KeyValuePairs, "}"].
|
maps:from_list(NewKeyValuePairs);
|
||||||
|
prepare_log_map(Term, _PEncode) ->
|
||||||
|
Term.
|
||||||
|
|
||||||
format_key_value_pairs([], _PEncode, Acc) ->
|
prepare_key_value(payload = K, V, PEncode) ->
|
||||||
lists:join(",", Acc);
|
NewV =
|
||||||
format_key_value_pairs([{payload, Value} | Rest], PEncode, Acc) ->
|
try
|
||||||
FormattedPayload = format_payload(Value, PEncode),
|
format_payload(V, PEncode)
|
||||||
FormattedPayloadEscaped = escape(FormattedPayload),
|
catch
|
||||||
Pair = ["\"payload\": \"", FormattedPayloadEscaped, "\""],
|
_:_:_ ->
|
||||||
format_key_value_pairs(Rest, PEncode, [Pair | Acc]);
|
V
|
||||||
format_key_value_pairs([{packet, Value} | Rest], PEncode, Acc) ->
|
end,
|
||||||
Formatted = format_packet(Value, PEncode),
|
{K, NewV};
|
||||||
FormattedEscaped = escape(Formatted),
|
prepare_key_value(packet = K, V, PEncode) ->
|
||||||
Pair = ["\"packet\": \"", FormattedEscaped, "\""],
|
NewV =
|
||||||
format_key_value_pairs(Rest, PEncode, [Pair | Acc]);
|
try
|
||||||
format_key_value_pairs([{Key, Value} | Rest], PEncode, Acc) ->
|
format_packet(V, PEncode)
|
||||||
FormattedKey = format_key(Key),
|
catch
|
||||||
FormattedValue = format_value(Value, PEncode),
|
_:_:_ ->
|
||||||
Pair = ["\"", FormattedKey, "\":", FormattedValue],
|
V
|
||||||
format_key_value_pairs(Rest, PEncode, [Pair | Acc]).
|
end,
|
||||||
|
{K, NewV};
|
||||||
format_key(Term) ->
|
prepare_key_value(K, V, PEncode) when is_map(V) ->
|
||||||
%% Keys must be strings
|
{K, prepare_log_map(V, PEncode)};
|
||||||
String = try_format_unicode(Term),
|
prepare_key_value(K, V, _PEncode) ->
|
||||||
escape(String).
|
{K, V}.
|
||||||
|
|
||||||
format_value(Map, PEncode) when is_map(Map) ->
|
|
||||||
format_log_map(Map, PEncode);
|
|
||||||
format_value(V, _PEncode) when is_integer(V) ->
|
|
||||||
integer_to_list(V);
|
|
||||||
format_value(V, _PEncode) when is_float(V) ->
|
|
||||||
float_to_list(V, [{decimals, 2}]);
|
|
||||||
format_value(true, _PEncode) ->
|
|
||||||
"true";
|
|
||||||
format_value(false, _PEncode) ->
|
|
||||||
"false";
|
|
||||||
format_value(V, _PEncode) ->
|
|
||||||
String = try_format_unicode(V),
|
|
||||||
["\"", escape(String), "\""].
|
|
||||||
|
|
||||||
try_format_unicode(undefined) ->
|
|
||||||
%% emqx_logger_textfmt:try_format_unicode converts the atom undefined to
|
|
||||||
%% the atom undefined
|
|
||||||
"undefined";
|
|
||||||
try_format_unicode(V) ->
|
|
||||||
emqx_logger_textfmt:try_format_unicode(V).
|
|
||||||
|
|
||||||
escape(IOList) ->
|
|
||||||
Bin = iolist_to_binary(IOList),
|
|
||||||
List = binary_to_list(Bin),
|
|
||||||
escape_list(List).
|
|
||||||
|
|
||||||
escape_list([]) ->
|
|
||||||
[];
|
|
||||||
escape_list([$\n | Rest]) ->
|
|
||||||
%% 92 is backslash
|
|
||||||
[92, $n | escape_list(Rest)];
|
|
||||||
escape_list([$" | Rest]) ->
|
|
||||||
[92, $" | escape_list(Rest)];
|
|
||||||
escape_list([92 | Rest]) ->
|
|
||||||
[92, 92 | escape_list(Rest)];
|
|
||||||
escape_list([X | Rest]) ->
|
|
||||||
[X | escape_list(Rest)].
|
|
||||||
|
|
||||||
format_packet(undefined, _) -> "";
|
format_packet(undefined, _) -> "";
|
||||||
format_packet(Packet, Encode) -> emqx_packet:format(Packet, Encode).
|
format_packet(Packet, Encode) -> emqx_packet:format(Packet, Encode).
|
||||||
|
|
Loading…
Reference in New Issue