diff options
Diffstat (limited to 'lib/kernel/src/logger_simple_h.erl')
-rw-r--r-- | lib/kernel/src/logger_simple_h.erl | 79 |
1 files changed, 53 insertions, 26 deletions
diff --git a/lib/kernel/src/logger_simple_h.erl b/lib/kernel/src/logger_simple_h.erl index fe8db09e83..d35c533b6d 100644 --- a/lib/kernel/src/logger_simple_h.erl +++ b/lib/kernel/src/logger_simple_h.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2017-2020. All Rights Reserved. +%% Copyright Ericsson AB 2017-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -68,14 +68,14 @@ log(#{msg:=_,meta:=#{time:=_}=M}=Log,_Config) -> %% Log directly from client just to get it out case maps:get(internal_log_event, M, false) of false -> - do_log( + do_log(simple, #{level=>error, msg=>{report,{error,simple_handler_process_dead}}, meta=>#{time=>logger:timestamp()}}); true -> ok end, - do_log(Log); + do_log(simple,Log); _ -> ?MODULE ! {log,Log} end, @@ -90,9 +90,9 @@ log(_,_) -> init(Starter) -> register(?MODULE,self()), Starter ! {self(),started}, - loop(#{buffer_size=>10,dropped=>0,buffer=>[]}). + loop(rich, #{buffer_size=>10,dropped=>0,buffer=>[]}). -loop(Buffer) -> +loop(Mode, Buffer) -> receive stop -> %% We replay the logger messages if there is @@ -109,11 +109,11 @@ loop(Buffer) -> unlink(whereis(logger)), ok; {log,#{msg:=_,meta:=#{time:=_}}=Log} -> - do_log(Log), - loop(update_buffer(Buffer,Log)); + NewMode = do_log(Mode, Log), + loop(NewMode, update_buffer(Buffer,Log)); _ -> %% Unexpected message - flush it! - loop(Buffer) + loop(Mode, Buffer) end. update_buffer(#{buffer_size:=0,dropped:=D}=Buffer,_Log) -> @@ -139,16 +139,42 @@ drop_msg(N) -> %%%----------------------------------------------------------------- %%% Internal -do_log(Log) -> - try - Str = logger_formatter:format(Log, - #{ legacy_header => true, single_line => false - ,depth => unlimited, time_offset => "" - }), - erlang:display_string(lists:flatten(unicode:characters_to_list(Str))) - catch _E:_R:_ST -> - % erlang:display({_E,_R,_ST}), - display_log(Log) +%% If the init process is busy (for instance doing a shutdown) +%% we can get blocked while trying to load code. So we spawn a process +%% for each log message that can potentially block. If the logging cannot +%% be done within 300ms, we instead log the raw log message to stdout +%% and switch mode to always log using the raw format. +do_log(simple, Log) -> + display_log(Log), simple; +do_log(rich = Mode, Log) -> + + {Pid, Ref} = + spawn_monitor( + fun() -> + Str = logger_formatter:format( + Log, + #{ legacy_header => true, single_line => false, + depth => unlimited, time_offset => "" + }), + erlang:display_string(stdout, lists:flatten(unicode:characters_to_list(Str))) + end), + receive + {'DOWN', Ref, _, _, normal} -> + Mode; + {'DOWN', Ref, _, _, _Else} -> + display_log(Log), + Mode + after 300 -> + %% init:terminate/3 sleeps for 500 ms before exiting, + %% so we wait for 300 ms for the log to happen + exit(Pid, kill), + receive + {'DOWN', Ref, _, _, normal} -> + Mode; + {'DOWN', Ref, _, _, _Else} -> + display_log(Log), + simple + end end. display_log(#{msg:={report,Report}, @@ -165,6 +191,7 @@ display_date(Timestamp) when is_integer(Timestamp) -> {{Y,Mo,D},{H,Mi,S}} = erlang:universaltime_to_localtime( erlang:posixtime_to_universaltime(Sec)), erlang:display_string( + stdout, integer_to_list(Y) ++ "-" ++ pad(Mo,2) ++ "-" ++ pad(D,2) ++ " " ++ @@ -182,7 +209,8 @@ pad(Str,Size) -> display({string,Chardata}) -> try unicode:characters_to_list(Chardata) of - String -> erlang:display_string(String), erlang:display_string("\n") + String -> erlang:display_string(stdout, String), + erlang:display_string(stdout, "\n") catch _:_ -> erlang:display(Chardata) end; display({report,Report}) when is_map(Report) -> @@ -190,9 +218,9 @@ display({report,Report}) when is_map(Report) -> display({report,Report}) -> display_report(Report); display({F, A}) when is_list(F), is_list(A) -> - erlang:display_string(F ++ "\n"), + erlang:display_string(stdout, F ++ "\n"), [begin - erlang:display_string("\t"), + erlang:display_string(stdout, "\t"), erlang:display(Arg) end || Arg <- A], ok. @@ -203,7 +231,7 @@ display_report(Atom, A) when is_atom(Atom) -> AtomString = atom_to_list(Atom), AtomLength = length(AtomString), Padding = lists:duplicate(ColumnWidth - AtomLength, $\s), - erlang:display_string(AtomString ++ Padding), + erlang:display_string(stdout, AtomString ++ Padding), display_report(A); display_report(F, A) -> erlang:display({F, A}). @@ -216,13 +244,12 @@ display_report([A, []]) -> display_report(A = [_|_]) -> case lists:all(fun({Key,_Value}) -> is_atom(Key); (_) -> false end, A) of true -> - erlang:display_string("\n"), + erlang:display_string(stdout, "\n"), lists:foreach( fun({Key, Value}) -> erlang:display_string( - " " ++ - atom_to_list(Key) ++ - ": "), + stdout, + " " ++ atom_to_list(Key) ++ ": "), erlang:display(Value) end, A); false -> |