Skip to content

Commit 6c8e70b

Browse files
author
José Valim
committed
Load handlers inside supervisor as they are now dynamic
1 parent c6fbfd2 commit 6c8e70b

File tree

5 files changed

+81
-71
lines changed

5 files changed

+81
-71
lines changed

lib/logger/lib/logger.ex

Lines changed: 3 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
defmodule Logger do
2-
use Application
3-
42
@moduledoc ~S"""
53
A logger for Elixir applications.
64
@@ -223,65 +221,6 @@ defmodule Logger do
223221
@type level :: :error | :info | :warn | :debug
224222
@levels [:error, :info, :warn, :debug]
225223

226-
@doc false
227-
def start(_type, _args) do
228-
import Supervisor.Spec
229-
230-
otp_reports? = Application.get_env(:logger, :handle_otp_reports)
231-
sasl_reports? = Application.get_env(:logger, :handle_sasl_reports)
232-
threshold = Application.get_env(:logger, :discard_threshold_for_error_logger)
233-
234-
handlers =
235-
for backend <- Application.get_env(:logger, :backends) do
236-
{Logger, translate_backend(backend), backend}
237-
end
238-
239-
options = [strategy: :rest_for_one, name: Logger.Supervisor]
240-
children = [worker(GenEvent, [[name: Logger]]),
241-
worker(Logger.Watcher, [Logger, Logger.Config, []],
242-
[id: Logger.Config, function: :watcher]),
243-
supervisor(Logger.Watcher, [handlers]),
244-
worker(Logger.Watcher,
245-
[:error_logger, Logger.ErrorHandler,
246-
{otp_reports?, sasl_reports?, threshold}],
247-
[id: Logger.ErrorHandler, function: :watcher])]
248-
249-
case Supervisor.start_link(children, options) do
250-
{:ok, _} = ok ->
251-
deleted = delete_error_logger_handler(otp_reports?, :error_logger_tty_h, [])
252-
deleted = delete_error_logger_handler(sasl_reports?, :sasl_report_tty_h, deleted)
253-
store_deleted_handlers(deleted)
254-
ok
255-
{:error, _} = error ->
256-
error
257-
end
258-
end
259-
260-
@doc false
261-
def stop(_) do
262-
Application.get_env(:logger, :deleted_handlers)
263-
|> Enum.each(&:error_logger.add_report_handler/1)
264-
265-
# We need to do this in another process as the Application
266-
# Controller is currently blocked shutting down this app.
267-
spawn_link(fn -> Logger.Config.clear_data end)
268-
269-
:ok
270-
end
271-
272-
defp store_deleted_handlers(list) do
273-
Application.put_env(:logger, :deleted_handlers, Enum.into(list, HashSet.new))
274-
end
275-
276-
defp delete_error_logger_handler(should_delete?, handler, deleted) do
277-
if should_delete? and
278-
:error_logger.delete_report_handler(handler) != {:error, :module_not_found} do
279-
[handler|deleted]
280-
else
281-
deleted
282-
end
283-
end
284-
285224
@metadata :logger_metadata
286225

287226
@doc """
@@ -365,7 +304,7 @@ defmodule Logger do
365304
"""
366305
def add_backend(backend, opts \\ []) do
367306
_ = if opts[:flush], do: GenEvent.which_handlers(:error_logger)
368-
case Logger.Watcher.watch(Logger, translate_backend(backend), backend) do
307+
case Logger.Watcher.watch(Logger, Logger.Config.translate_backend(backend), backend) do
369308
{:ok, _} = ok ->
370309
Logger.Config.add_backend(backend)
371310
ok
@@ -386,7 +325,7 @@ defmodule Logger do
386325
def remove_backend(backend, opts \\ []) do
387326
_ = if opts[:flush], do: GenEvent.which_handlers(:error_logger)
388327
Logger.Config.remove_backend(backend)
389-
Logger.Watcher.unwatch(Logger, translate_backend(backend))
328+
Logger.Watcher.unwatch(Logger, Logger.Config.translate_backend(backend))
390329
end
391330

392331
@doc """
@@ -411,12 +350,9 @@ defmodule Logger do
411350
"""
412351
@spec configure_backend(backend, Keywowrd.t) :: term
413352
def configure_backend(backend, options) when is_list(options) do
414-
GenEvent.call(Logger, translate_backend(backend), {:configure, options})
353+
GenEvent.call(Logger, Logger.Config.translate_backend(backend), {:configure, options})
415354
end
416355

417-
defp translate_backend(:console), do: Logger.Backends.Console
418-
defp translate_backend(other), do: other
419-
420356
@doc """
421357
Logs a message.
422358

lib/logger/lib/logger/app.ex

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
defmodule Logger.App do
2+
@moduledoc false
3+
4+
use Application
5+
6+
def start(_type, _args) do
7+
import Supervisor.Spec
8+
9+
otp_reports? = Application.get_env(:logger, :handle_otp_reports)
10+
sasl_reports? = Application.get_env(:logger, :handle_sasl_reports)
11+
threshold = Application.get_env(:logger, :discard_threshold_for_error_logger)
12+
13+
options = [strategy: :rest_for_one, name: Logger.Supervisor]
14+
children = [worker(GenEvent, [[name: Logger]]),
15+
worker(Logger.Watcher, [Logger, Logger.Config, []],
16+
[id: Logger.Config, function: :watcher]),
17+
supervisor(Logger.Watcher, [Logger.Config, :handlers, []]),
18+
worker(Logger.Watcher,
19+
[:error_logger, Logger.ErrorHandler,
20+
{otp_reports?, sasl_reports?, threshold}],
21+
[id: Logger.ErrorHandler, function: :watcher])]
22+
23+
case Supervisor.start_link(children, options) do
24+
{:ok, _} = ok ->
25+
deleted = delete_error_logger_handler(otp_reports?, :error_logger_tty_h, [])
26+
deleted = delete_error_logger_handler(sasl_reports?, :sasl_report_tty_h, deleted)
27+
store_deleted_handlers(deleted)
28+
ok
29+
{:error, _} = error ->
30+
error
31+
end
32+
end
33+
34+
def stop(_) do
35+
Application.get_env(:logger, :deleted_handlers)
36+
|> Enum.each(&:error_logger.add_report_handler/1)
37+
38+
# We need to do this in another process as the Application
39+
# Controller is currently blocked shutting down this app.
40+
spawn_link(fn -> Logger.Config.clear_data end)
41+
42+
:ok
43+
end
44+
45+
defp store_deleted_handlers(list) do
46+
Application.put_env(:logger, :deleted_handlers, Enum.into(list, HashSet.new))
47+
end
48+
49+
defp delete_error_logger_handler(should_delete?, handler, deleted) do
50+
if should_delete? and
51+
:error_logger.delete_report_handler(handler) != {:error, :module_not_found} do
52+
[handler|deleted]
53+
else
54+
deleted
55+
end
56+
end
57+
end

lib/logger/lib/logger/config.ex

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ defmodule Logger.Config do
2222
GenEvent.call(Logger, @name, {:remove_translator, translator})
2323
end
2424

25+
def handlers() do
26+
for backend <- backends() do
27+
{Logger, translate_backend(backend), backend}
28+
end
29+
end
30+
31+
def backends() do
32+
GenEvent.call(Logger, @name, :backends)
33+
end
34+
2535
def add_backend(backend) do
2636
GenEvent.call(Logger, @name, {:add_backend, backend})
2737
end
@@ -30,6 +40,9 @@ defmodule Logger.Config do
3040
GenEvent.call(Logger, @name, {:remove_backend, backend})
3141
end
3242

43+
def translate_backend(:console), do: Logger.Backends.Console
44+
def translate_backend(other), do: other
45+
3346
def __data__() do
3447
Application.get_env(:logger, @data)
3548
end
@@ -79,6 +92,10 @@ defmodule Logger.Config do
7992
end
8093
end
8194

95+
def handle_call(:backends, state) do
96+
{:ok, Application.get_env(:logger, :backends), state}
97+
end
98+
8299
def handle_call({:configure, options}, state) do
83100
Enum.each options, fn {key, value} ->
84101
Application.put_env(:logger, key, value)

lib/logger/lib/logger/watcher.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ defmodule Logger.Watcher do
88
@doc """
99
Starts the watcher supervisor.
1010
"""
11-
def start_link(handlers) do
11+
def start_link(m, f, a) do
1212
options = [strategy: :one_for_one, name: @name]
1313
case Supervisor.start_link([], options) do
1414
{:ok, _} = ok ->
15-
_ = for {mod, handler, args} <- handlers do
15+
_ = for {mod, handler, args} <- apply(m, f, a) do
1616
{:ok, _} = watch(mod, handler, args)
1717
end
1818
ok
@@ -29,7 +29,7 @@ defmodule Logger.Watcher do
2929
end
3030

3131
@doc """
32-
Watches the given handler as part of the handler supervision tree.
32+
Watches the given handler as part of the watcher supervision tree.
3333
"""
3434
def watch(mod, handler, args) do
3535
import Supervisor.Spec

lib/logger/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ defmodule Logger.Mixfile do
99

1010
def application do
1111
[registered: [Logger, Logger.Supervisor, Logger.Watcher],
12-
mod: {Logger, []},
12+
mod: {Logger.App, []},
1313
env: [level: :debug,
1414
utc_log: false,
1515
truncate: 8096,

0 commit comments

Comments
 (0)