File 0258-fix-logger_formatter-format-by-making-templates-line.patch of Package erlang
From fe36d8b1c767691265f55b665910a0d60d9bfb7e Mon Sep 17 00:00:00 2001
From: gfngfn <suwa-takashi141@g.ecc.u-tokyo.ac.jp>
Date: Tue, 31 May 2022 10:46:39 +0900
Subject: [PATCH] fix `logger_formatter:format` by making templates linear
before split
This modification is for fixing a strange behavior of the
logger formatter about `msg` occurring at conditional branching
in logger templates; see
https://github.com/gfngfn/a_strange_behavior_of_logger_formatter
for example.
---
lib/kernel/src/logger_formatter.erl | 22 ++++++++++++++--------
lib/kernel/test/logger_formatter_SUITE.erl | 14 +++++++++++++-
2 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/lib/kernel/src/logger_formatter.erl b/lib/kernel/src/logger_formatter.erl
index 579b4f8f73..f64ec85b32 100644
--- a/lib/kernel/src/logger_formatter.erl
+++ b/lib/kernel/src/logger_formatter.erl
@@ -48,7 +48,8 @@ format(#{level:=Level,msg:=Msg0,meta:=Meta},Config0)
Config = add_default_config(Config0),
Meta1 = maybe_add_legacy_header(Level,Meta,Config),
Template = maps:get(template,Config),
- {BT,AT0} = lists:splitwith(fun(msg) -> false; (_) -> true end, Template),
+ LinearTemplate = linearize_template(Meta1,Template),
+ {BT,AT0} = lists:splitwith(fun(msg) -> false; (_) -> true end, LinearTemplate),
{DoMsg,AT} =
case AT0 of
[msg|Rest] -> {true,Rest};
@@ -89,6 +90,18 @@ format(#{level:=Level,msg:=Msg0,meta:=Meta},Config0)
end,
truncate(B,MsgStr,A,maps:get(max_size,Config)).
+linearize_template(Data,[{Key,IfExist,Else}|Format]) ->
+ BranchForUse =
+ case value(Key,Data) of
+ {ok,_Value} -> linearize_template(Data,IfExist);
+ error -> linearize_template(Data,Else)
+ end,
+ BranchForUse ++ linearize_template(Data,Format);
+linearize_template(Data,[StrOrKey|Format]) ->
+ [StrOrKey|linearize_template(Data,Format)];
+linearize_template(_Data,[]) ->
+ [].
+
trim([H|T],Rev) when H==$\s; H==$\r; H==$\n ->
trim(T,Rev);
trim([H|T],false) when is_list(H) ->
@@ -110,13 +123,6 @@ trim(String,_) ->
do_format(Level,Data,[level|Format],Config) ->
[to_string(level,Level,Config)|do_format(Level,Data,Format,Config)];
-do_format(Level,Data,[{Key,IfExist,Else}|Format],Config) ->
- String =
- case value(Key,Data) of
- {ok,Value} -> do_format(Level,Data#{Key=>Value},IfExist,Config);
- error -> do_format(Level,Data,Else,Config)
- end,
- [String|do_format(Level,Data,Format,Config)];
do_format(Level,Data,[Key|Format],Config)
when is_atom(Key) orelse
(is_list(Key) andalso is_atom(hd(Key))) ->
diff --git a/lib/kernel/test/logger_formatter_SUITE.erl b/lib/kernel/test/logger_formatter_SUITE.erl
index f1c64110a1..d160dce32f 100644
--- a/lib/kernel/test/logger_formatter_SUITE.erl
+++ b/lib/kernel/test/logger_formatter_SUITE.erl
@@ -272,7 +272,7 @@ template(_Config) ->
[[nested,subkey]]),
String8 = format(info,{"~p",[term]},Meta8,#{template=>Template8,
single_line=>true}),
- ct:log(String6),
+ ct:log(String8),
SelfStr = pid_to_list(self()),
RefStr8 = ref_to_list(Ref8),
ListStr = "[list,\"string\",4321,#{},{tuple}]",
@@ -345,6 +345,18 @@ template(_Config) ->
_ -> ct:fail({full_nested_map_unexpected,MultipleKeysStr10})
end,
+ Meta11A = #{time=>Time,be_short=>ok},
+ Meta11B = #{time=>Time},
+ Template11 =
+ [{be_short,
+ ["short:",msg],
+ ["long:[",level,"]",msg]}],
+ String11A = format(info,{"~p",[term]},Meta11A,#{template=>Template11,single_line=>true}),
+ String11B = format(info,{"~p",[term]},Meta11B,#{template=>Template11,single_line=>true}),
+ ct:log(String11A),
+ ct:log(String11B),
+ {"short:term","long:[info]term"} = {String11A,String11B},
+
ok.
format_msg(_Config) ->
--
2.35.3