Skip to content

Commit 9420945

Browse files
author
José Valim
committed
Leave it to the application to start Logger after compilation
Closes #2649
1 parent 4ca1736 commit 9420945

File tree

9 files changed

+73
-60
lines changed

9 files changed

+73
-60
lines changed

lib/logger/lib/logger/app.ex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule Logger.App do
33

44
use Application
55

6+
@doc false
67
def start(_type, _args) do
78
import Supervisor.Spec
89

@@ -31,6 +32,7 @@ defmodule Logger.App do
3132
end
3233
end
3334

35+
@doc false
3436
def stop(_) do
3537
Application.get_env(:logger, :deleted_handlers)
3638
|> Enum.each(&:error_logger.add_report_handler/1)
@@ -42,6 +44,16 @@ defmodule Logger.App do
4244
:ok
4345
end
4446

47+
@doc """
48+
Stops the application without sending messages to error logger.
49+
"""
50+
def stop() do
51+
set = Application.get_env(:logger, :deleted_handlers)
52+
Application.put_env(:logger, :deleted_handlers, HashSet.new)
53+
Application.stop(:logger)
54+
Enum.each(set, &:error_logger.add_report_handler/1)
55+
end
56+
4557
defp store_deleted_handlers(list) do
4658
Application.put_env(:logger, :deleted_handlers, Enum.into(list, HashSet.new))
4759
end

lib/logger/lib/logger/config.ex

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,6 @@ defmodule Logger.Config do
5151
Application.delete_env(:logger, @data)
5252
end
5353

54-
def restart do
55-
set = Application.get_env(:logger, :deleted_handlers)
56-
Application.put_env(:logger, :deleted_handlers, HashSet.new)
57-
Application.stop(:logger)
58-
Enum.each(set, &:error_logger.add_report_handler/1)
59-
Application.start(:logger)
60-
end
61-
6254
## Callbacks
6355

6456
def init(_) do

lib/logger/test/logger/translator_test.exs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,18 @@ defmodule Logger.TranslatorTest do
3434
setup_all do
3535
sasl_reports? = Application.get_env(:logger, :handle_sasl_reports, false)
3636
Application.put_env(:logger, :handle_sasl_reports, true)
37+
38+
# Restart the app but change the level before to avoid warnings
3739
level = Logger.level()
38-
Logger.configure([level: :error])
39-
Logger.Config.restart()
40-
Logger.configure([level: level])
40+
Logger.configure(level: :error)
41+
Logger.App.stop()
42+
Application.start(:logger)
43+
Logger.configure(level: level)
44+
4145
on_exit(fn() ->
4246
Application.put_env(:logger, :handle_sasl_reports, sasl_reports?)
43-
Logger.Config.restart()
47+
Logger.App.stop()
48+
Application.start(:logger)
4449
end)
4550
end
4651

lib/logger/test/logger_test.exs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,16 +170,10 @@ defmodule LoggerTest do
170170
end
171171
end
172172

173-
test "Logger.Config survives Logger exit" do
174-
Process.whereis(Logger) |> Process.exit(:kill)
175-
wait_for_logger()
176-
wait_for_handler(Logger, Logger.Config)
177-
wait_for_handler(:error_logger, Logger.ErrorHandler)
178-
end
179-
180-
test "Logger.Config can restart the application" do
173+
test "stop the application silently" do
181174
Application.put_env(:logger, :backends, [])
182-
Logger.Config.restart()
175+
Logger.App.stop()
176+
Application.start(:logger)
183177

184178
assert capture_log(fn ->
185179
assert Logger.debug("hello", []) == :ok
@@ -190,6 +184,14 @@ defmodule LoggerTest do
190184
{:error, {:already_started, pid}}
191185
after
192186
Application.put_env(:logger, :backends, [:console])
193-
Logger.Config.restart()
187+
Logger.App.stop()
188+
Application.start(:logger)
189+
end
190+
191+
test "restarts Logger.Config on Logger exits" do
192+
Process.whereis(Logger) |> Process.exit(:kill)
193+
wait_for_logger()
194+
wait_for_handler(Logger, Logger.Config)
195+
wait_for_handler(:error_logger, Logger.ErrorHandler)
194196
end
195197
end

lib/mix/lib/mix/tasks/app.start.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ defmodule Mix.Tasks.App.Start do
2525
Mix.Task.run "compile", ["--no-readd"|args]
2626
end
2727

28+
# Stop the Logger after we have used it for compilation.
29+
# It is up to the application to decide if it should be
30+
# restarted or not.
31+
Logger.App.stop()
32+
2833
unless "--no-start" in args do
2934
start(Mix.Project.config[:app])
3035
end

lib/mix/lib/mix/tasks/loadconfig.ex

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,7 @@ defmodule Mix.Tasks.Loadconfig do
2727
end
2828

2929
defp load(file) do
30-
opts = Mix.Config.read!(file)
31-
Mix.Config.persist(opts)
32-
33-
# In case the Logger was changed, we reload the whole
34-
# Logger. This is required because many of Logger config
35-
# reflects on its supervision tree. No other application
36-
# that is bundled with Elixir requires such reloading.
37-
if opts[:logger], do: Logger.Config.restart
38-
30+
Mix.Config.persist Mix.Config.read!(file)
3931
:ok
4032
end
4133
end

lib/mix/test/mix/tasks/app.start_test.exs

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ defmodule Mix.Tasks.App.StartTest do
77
def project do
88
[app: :app_start_sample, version: "0.1.0"]
99
end
10+
11+
def application do
12+
[applications: [:logger]]
13+
end
1014
end
1115

1216
defmodule WrongElixirProject do
@@ -22,39 +26,23 @@ defmodule Mix.Tasks.App.StartTest do
2226
end
2327

2428
setup config do
29+
on_exit fn ->
30+
Application.start(:logger)
31+
end
32+
2533
if app = config[:app] do
2634
Logger.remove_backend(:console)
2735

2836
on_exit fn ->
29-
:application.stop(app)
30-
:application.unload(app)
37+
Application.stop(app)
38+
Application.unload(app)
3139
Logger.add_backend(:console, flush: true)
3240
end
3341
end
3442

3543
:ok
3644
end
3745

38-
test "recompiles project if elixir version changed" do
39-
Mix.Project.push MixTest.Case.Sample
40-
41-
in_fixture "no_mixfile", fn ->
42-
Mix.Tasks.Compile.run []
43-
purge [A, B, C]
44-
45-
assert_received {:mix_shell, :info, ["Compiled lib/a.ex"]}
46-
assert System.version == Mix.Dep.Lock.elixir_vsn
47-
48-
Mix.Task.clear
49-
File.write!("_build/dev/lib/sample/.compile.lock", "the_past")
50-
File.touch!("_build/dev/lib/sample/.compile.lock", {{2010, 1, 1}, {0, 0, 0}})
51-
52-
Mix.Tasks.App.Start.run ["--no-start"]
53-
assert System.version == Mix.Dep.Lock.elixir_vsn
54-
assert File.stat!("_build/dev/lib/sample/.compile.lock").mtime > {{2010, 1, 1}, {0, 0, 0}}
55-
end
56-
end
57-
5846
test "compiles and starts the project" do
5947
Mix.Project.push AppStartSample
6048

@@ -66,10 +54,13 @@ defmodule Mix.Tasks.App.StartTest do
6654
Mix.Tasks.App.Start.run ["--no-start"]
6755
assert File.regular?("_build/dev/lib/app_start_sample/ebin/Elixir.A.beam")
6856
assert File.regular?("_build/dev/lib/app_start_sample/ebin/app_start_sample.app")
69-
refute List.keyfind(:application.loaded_applications, :app_start_sample, 0)
57+
58+
refute List.keyfind(:application.which_applications, :app_start_sample, 0)
59+
refute List.keyfind(:application.which_applications, :logger, 0)
7060

7161
Mix.Tasks.App.Start.run []
72-
assert List.keyfind(:application.loaded_applications, :app_start_sample, 0)
62+
assert List.keyfind(:application.which_applications, :app_start_sample, 0)
63+
assert List.keyfind(:application.which_applications, :logger, 0)
7364
end
7465
end
7566

lib/mix/test/mix/tasks/compile_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,22 @@ defmodule Mix.Tasks.CompileTest do
5656
refute File.regular?("ebin/Elixir.C.beam")
5757
end
5858
end
59+
60+
test "recompiles project if elixir version changed" do
61+
in_fixture "no_mixfile", fn ->
62+
Mix.Tasks.Compile.run []
63+
purge [A, B, C]
64+
65+
assert_received {:mix_shell, :info, ["Compiled lib/a.ex"]}
66+
assert System.version == Mix.Dep.Lock.elixir_vsn
67+
68+
Mix.Task.clear
69+
File.write!("_build/dev/lib/sample/.compile.lock", "the_past")
70+
File.touch!("_build/dev/lib/sample/.compile.lock", {{2010, 1, 1}, {0, 0, 0}})
71+
72+
Mix.Tasks.Compile.run []
73+
assert System.version == Mix.Dep.Lock.elixir_vsn
74+
assert File.stat!("_build/dev/lib/sample/.compile.lock").mtime > {{2010, 1, 1}, {0, 0, 0}}
75+
end
76+
end
5977
end

lib/mix/test/mix/tasks/loadconfig_test.exs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ defmodule Mix.Tasks.LoadconfigTest do
2121

2222
in_fixture "no_mixfile", fn ->
2323
write_config """
24-
[my_app: [key: :project],
25-
logger: [level: :error]]
24+
[my_app: [key: :project]]
2625
"""
2726

2827
# Original Logger level
@@ -36,9 +35,6 @@ defmodule Mix.Tasks.LoadconfigTest do
3635
:ok = :application.load({:application, :my_app, [vsn: '1.0.0', env: [key: :app]]})
3736
assert Application.fetch_env(:my_app, :key) == {:ok, :project}
3837

39-
# Logger is reloaded
40-
assert Logger.level == :error
41-
4238
# laodconfig can be called multiple times
4339
# Later values should have higher precedence
4440
Mix.Task.run "loadconfig", [fixture_path("configs/good_config.exs")]

0 commit comments

Comments
 (0)