summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Larsson <lukas@erlang.org>2020-02-20 15:53:10 +0100
committerLukas Larsson <lukas@erlang.org>2020-02-21 10:06:51 +0100
commit16e3e72deb5ae77005ca43824a2401c05f377f98 (patch)
tree3d015a224c915228750ca2ae64c14fb28a7744ce
parent6d44ae718520f0678413cbace51734acca584e2c (diff)
downloaderlang-16e3e72deb5ae77005ca43824a2401c05f377f98.tar.gz
logger: Don't crash when unavailable during boot
If we try to log something before logger is started we don't want to crash. Instead we print using erlang:display.
-rw-r--r--erts/preloaded/src/erl_prim_loader.erl18
-rw-r--r--erts/preloaded/src/prim_file.erl10
-rw-r--r--lib/kernel/src/code_server.erl25
3 files changed, 32 insertions, 21 deletions
diff --git a/erts/preloaded/src/erl_prim_loader.erl b/erts/preloaded/src/erl_prim_loader.erl
index 1605c20f2c..89c535c43a 100644
--- a/erts/preloaded/src/erl_prim_loader.erl
+++ b/erts/preloaded/src/erl_prim_loader.erl
@@ -300,12 +300,18 @@ check_file_result(Func, Target, {error,Reason}) ->
%% This is equal to calling logger:error/2 which
%% we don't want to do from code_server during system boot.
%% We don't want to call logger:timestamp() either.
- logger ! {log,error,#{label=>{?MODULE,file_error},report=>Report},
- #{pid=>self(),
- gl=>group_leader(),
- time=>os:system_time(microsecond),
- error_logger=>#{tag=>error_report,
- type=>std_error}}},
+ try
+ logger ! {log,error,#{label=>{?MODULE,file_error},report=>Report},
+ #{pid=>self(),
+ gl=>group_leader(),
+ time=>os:system_time(microsecond),
+ error_logger=>#{tag=>error_report,
+ type=>std_error}}}
+ catch _:_ ->
+ %% If logger has not been started yet we just display it
+ erlang:display({?MODULE,file_error}),
+ erlang:display(Report)
+ end,
error
end;
check_file_result(_, _, Other) ->
diff --git a/erts/preloaded/src/prim_file.erl b/erts/preloaded/src/prim_file.erl
index 1aa5d85c64..f241be8569 100644
--- a/erts/preloaded/src/prim_file.erl
+++ b/erts/preloaded/src/prim_file.erl
@@ -575,11 +575,11 @@ list_dir_convert([RawName | Rest], SkipInvalid, Result) ->
%% This is equal to calling logger:warning/3 which
%% we don't want to do from code_server during system boot.
%% We don't want to call logger:timestamp() either.
- logger ! {log,warning,"Non-unicode filename ~p ignored\n", [RawName],
- #{pid=>self(),
- gl=>group_leader(),
- time=>os:system_time(microsecond),
- error_logger=>#{tag=>warning_msg}}},
+ catch logger ! {log,warning,"Non-unicode filename ~p ignored\n", [RawName],
+ #{pid=>self(),
+ gl=>group_leader(),
+ time=>os:system_time(microsecond),
+ error_logger=>#{tag=>warning_msg}}},
list_dir_convert(Rest, SkipInvalid, Result);
{error, _} ->
{error, {no_translation, RawName}}
diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl
index 68e1205301..3542ee3a7f 100644
--- a/lib/kernel/src/code_server.erl
+++ b/lib/kernel/src/code_server.erl
@@ -1437,11 +1437,16 @@ error_msg(Format, Args) ->
%% This is equal to calling logger:error/3 which we don't want to
%% do from code_server. We don't want to call logger:timestamp()
%% either.
- logger ! {log,error,Format,Args,
- #{pid=>self(),
- gl=>group_leader(),
- time=>os:system_time(microsecond),
- error_logger=>#{tag=>error}}},
+ try
+ logger ! {log,error,Format,Args,
+ #{pid=>self(),
+ gl=>group_leader(),
+ time=>os:system_time(microsecond),
+ error_logger=>#{tag=>error}}}
+ catch _:_ ->
+ erlang:display({?MODULE,error}),
+ erlang:display({Format,Args})
+ end,
ok.
-spec info_msg(io:format(), [term()]) -> 'ok'.
@@ -1449,11 +1454,11 @@ info_msg(Format, Args) ->
%% This is equal to calling logger:info/3 which we don't want to
%% do from code_server. We don't want to call logger:timestamp()
%% either.
- logger ! {log,info,Format,Args,
- #{pid=>self(),
- gl=>group_leader(),
- time=>os:system_time(microsecond),
- error_logger=>#{tag=>info_msg}}},
+ catch logger ! {log,info,Format,Args,
+ #{pid=>self(),
+ gl=>group_leader(),
+ time=>os:system_time(microsecond),
+ error_logger=>#{tag=>info_msg}}},
ok.
objfile_extension() ->