Skip to content

Commit f4b6375

Browse files
authored
Fix logger and stacktrace warnings on OTP 21 (#7646)
Those are the minimum fixes which preserve the existing behaviour. More performant fixes in the logger cases will be applied to master and the upcoming Elixir v1.7.
1 parent ccc24ea commit f4b6375

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

lib/elixir/src/elixir_erl_compiler.erl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ handle_file_warning(_, _File, {_Line, erl_lint, {undefined_behaviour_func, _, _}
6363
handle_file_warning(_, _File, {_Line, erl_lint, {undefined_behaviour, _}}) -> ok;
6464
handle_file_warning(_, _File, {_Line, erl_lint, {ill_defined_behaviour_callbacks, _}}) -> ok;
6565
handle_file_warning(_, _File, {_Line, erl_lint, {ill_defined_optional_callbacks, _}}) -> ok;
66+
handle_file_warning(_, _File, {_Line, erl_lint, {deprecated,{erlang,get_stacktrace,0},_}}) -> ok;
6667

6768
handle_file_warning(_, File, {Line, Module, Desc}) ->
6869
Message = format_error(Module, Desc),

lib/logger/lib/logger/app.ex

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ defmodule Logger.App do
2828

2929
case Supervisor.start_link(children, strategy: :rest_for_one, name: Logger.Supervisor) do
3030
{:ok, sup} ->
31-
handlers = [error_logger_tty_h: otp_reports?, sasl_report_tty_h: sasl_reports?]
32-
delete_handlers(handlers)
31+
if otp_reports? or sasl_reports? do
32+
delete_handlers(otp_reports?, sasl_reports?)
33+
end
34+
3335
{:ok, sup, config}
3436

3537
{:error, _} = error ->
@@ -45,9 +47,7 @@ defmodule Logger.App do
4547

4648
@doc false
4749
def stop(config) do
48-
Logger.Config.deleted_handlers()
49-
|> add_handlers()
50-
50+
add_handlers(Logger.Config.deleted_handlers())
5151
Logger.Config.delete(config)
5252
end
5353

@@ -73,17 +73,33 @@ defmodule Logger.App do
7373
end
7474
end
7575

76-
defp delete_handlers(handlers) do
77-
to_delete =
78-
for {handler, delete?} <- handlers,
79-
delete? && :error_logger.delete_report_handler(handler) != {:error, :module_not_found},
80-
do: handler
76+
defp delete_handlers(otp_reports?, sasl_reports?) do
77+
deleted =
78+
if is_pid(Process.whereis(:logger)) and Code.ensure_loaded?(:logger) do
79+
with {:ok, {module, config}} <- :logger.get_handler_config(:logger_std_h),
80+
:ok <- :logger.remove_handler(:logger_std_h) do
81+
[{:logger_std_h, module, config}]
82+
else
83+
_ -> []
84+
end
85+
else
86+
for {tty, true} <- [error_logger_tty_h: otp_reports?, sasl_report_tty_h: sasl_reports?],
87+
:error_logger.delete_report_handler(tty) != {:error, :module_not_found},
88+
do: tty
89+
end
8190

82-
[] = Logger.Config.deleted_handlers(to_delete)
91+
[] = Logger.Config.deleted_handlers(deleted)
8392
:ok
8493
end
8594

8695
defp add_handlers(handlers) do
87-
Enum.each(handlers, &:error_logger.add_report_handler/1)
96+
for handler <- handlers do
97+
case handler do
98+
{handler, module, config} -> :logger.add_handler(handler, module, config)
99+
handler -> :error_logger.add_report_handler(handler)
100+
end
101+
end
102+
103+
:ok
88104
end
89105
end

lib/logger/lib/logger/watcher.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ defmodule Logger.Watcher do
2020
def init({mod, handler, args}) do
2121
Process.flag(:trap_exit, true)
2222

23+
# This is required for OTP 21. A better fix would be to not include
24+
# the error_logger handler in the first place but we will do so only
25+
# in future Elixir versions.
26+
unless Process.whereis(mod) do
27+
_ = :logger.add_handler(mod, mod, %{level: :info, filter_default: :log})
28+
end
29+
2330
case :gen_event.delete_handler(mod, handler, :ok) do
2431
{:error, :module_not_found} ->
2532
case :gen_event.add_sup_handler(mod, handler, args) do

0 commit comments

Comments
 (0)