Skip to content

Commit f1a3937

Browse files
author
José Valim
committed
Do not crash the caller when Logger is not available
Instead, return :ok | {:error, :not_available} and leave it up to the caller to decide.
1 parent be75e3b commit f1a3937

File tree

3 files changed

+18
-20
lines changed

3 files changed

+18
-20
lines changed

lib/logger/lib/logger.ex

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ defmodule Logger do
1313
to avoid clogging logger backends.
1414
1515
* Alternates between sync and async modes to remain
16-
performant when required but also apply back-pressure
16+
performant when required but also apply back-pressure
1717
when under stress.
1818
1919
* Wraps OTP's `error_logger` to prevent it from
@@ -244,7 +244,6 @@ defmodule Logger do
244244
"""
245245
@spec level() :: level
246246
def level() do
247-
check_logger!
248247
%{level: level} = Logger.Config.__data__
249248
level
250249
end
@@ -365,19 +364,23 @@ defmodule Logger do
365364
Use this function only when there is a need to log dynamically
366365
or you want to explicitly avoid embedding metadata.
367366
"""
368-
@spec log(level, IO.chardata | (() -> IO.chardata), Keyword.t) :: :ok
367+
@spec log(level, IO.chardata | (() -> IO.chardata), Keyword.t) :: :ok | {:error, :not_available}
369368
def log(level, chardata, metadata \\ []) when level in @levels and is_list(metadata) do
370-
check_logger!
371369
%{mode: mode, truncate: truncate,
372370
level: min_level, utc_log: utc_log?} = Logger.Config.__data__
373371

374372
if compare_levels(level, min_level) != :lt do
375373
tuple = {Logger, truncate(chardata, truncate), Logger.Utils.timestamp(utc_log?),
376374
[pid: self()] ++ metadata() ++ metadata}
377-
notify(mode, {level, Process.group_leader(), tuple})
375+
try do
376+
notify(mode, {level, Process.group_leader(), tuple})
377+
:ok
378+
rescue
379+
ArgumentError -> {:error, :not_available}
380+
end
381+
else
382+
:ok
378383
end
379-
380-
:ok
381384
end
382385

383386
@doc """
@@ -452,10 +455,4 @@ defmodule Logger do
452455

453456
defp notify(:sync, msg), do: GenEvent.sync_notify(Logger, msg)
454457
defp notify(:async, msg), do: GenEvent.notify(Logger, msg)
455-
456-
defp check_logger! do
457-
unless Process.whereis(Logger) do
458-
raise "Cannot log messages, the :logger application is not running"
459-
end
460-
end
461458
end

lib/logger/lib/logger/config.ex

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ defmodule Logger.Config do
4444
def translate_backend(other), do: other
4545

4646
def __data__() do
47-
Application.get_env(:logger, @data)
47+
if data = Application.get_env(:logger, @data) do
48+
data
49+
else
50+
raise "Cannot use Logger, the :logger application is not running"
51+
end
4852
end
4953

5054
def clear_data() do
@@ -55,7 +59,7 @@ defmodule Logger.Config do
5559

5660
def init(_) do
5761
# Use previous data if available in case this handler crashed.
58-
state = __data__ || compute_state(:async)
62+
state = Application.get_env(:logger, @data) || compute_state(:async)
5963
{:ok, state}
6064
end
6165

lib/logger/test/logger_test.exs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,15 +156,12 @@ defmodule LoggerTest do
156156
Logger.configure(truncate: 8096)
157157
end
158158

159-
test "log/2 fails when the application is off" do
159+
test "log/2 does not fails when the Logger is off" do
160160
logger = Process.whereis(Logger)
161161
Process.unregister(Logger)
162162

163163
try do
164-
assert_raise RuntimeError,
165-
"Cannot log messages, the :logger application is not running", fn ->
166-
Logger.log(:debug, "hello")
167-
end
164+
assert Logger.log(:debug, "hello") == {:error, :not_available}
168165
after
169166
Process.register(logger, Logger)
170167
end

0 commit comments

Comments
 (0)