Skip to content

Commit 806804e

Browse files
author
José Valim
committed
Allow console device to be configured
1 parent 5e4ad96 commit 806804e

File tree

5 files changed

+42
-24
lines changed

5 files changed

+42
-24
lines changed

lib/ex_unit/lib/ex_unit/capture_log.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ defmodule ExUnit.CaptureLog do
106106

107107
@doc false
108108
def init_proxy(pid, opts, parent) do
109-
case :gen_event.add_sup_handler(Logger, {Console, pid}, {pid, opts}) do
109+
case :gen_event.add_sup_handler(Logger, {Console, pid}, {Console, [device: pid] ++ opts}) do
110110
:ok ->
111111
ref = Process.monitor(parent)
112112
:proc_lib.init_ack(:ok)

lib/logger/lib/logger.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,9 @@ defmodule Logger do
183183
184184
* `:colors` - a keyword list of coloring options.
185185
186+
* `:device` - the device to log error messages to. Defaults to
187+
`:user` but can be changed to something else such as `:standard_error`.
188+
186189
* `:max_buffer` - maximum events to buffer while waiting
187190
for a confirmation from the IO device (default: 32).
188191
Once the buffer is full, the backend will block until

lib/logger/lib/logger/backends/console.ex

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,26 @@ defmodule Logger.Backends.Console do
77
max_buffer: nil, buffer_size: 0, buffer: [], ref: nil, output: nil]
88

99
def init(:console) do
10-
if Process.whereis(:user) do
11-
init({:user, []})
10+
config = Application.get_env(:logger, :console)
11+
device = Keyword.get(config, :device, :user)
12+
13+
if Process.whereis(device) do
14+
{:ok, init(config, %__MODULE__{})}
1215
else
1316
{:error, :ignore}
1417
end
1518
end
1619

17-
def init({device, opts}) do
18-
{:ok, configure(device, opts, %__MODULE__{})}
20+
def init({__MODULE__, opts}) when is_list(opts) do
21+
config = configure_merge(Application.get_env(:logger, :console), opts)
22+
{:ok, init(config, %__MODULE__{})}
1923
end
2024

2125
def handle_call({:configure, options}, state) do
22-
{:ok, :ok, configure(state.device, options, state)}
26+
{:ok, :ok, configure(options, state)}
2327
end
2428

25-
def handle_event({_level, gl, _event}, state)
26-
when node(gl) != node() do
29+
def handle_event({_level, gl, _event}, state) when node(gl) != node() do
2730
{:ok, state}
2831
end
2932

@@ -79,20 +82,20 @@ defmodule Logger.Backends.Console do
7982
Logger.compare_levels(lvl, min) != :lt
8083
end
8184

82-
defp configure(device, options, state) do
83-
config =
84-
Application.get_env(:logger, :console, [])
85-
|> configure_merge(options)
86-
87-
if device === :user do
88-
Application.put_env(:logger, :console, config)
89-
end
85+
defp configure(options, state) do
86+
config = configure_merge(Application.get_env(:logger, :console), options)
87+
Application.put_env(:logger, :console, config)
88+
init(config, state)
89+
end
9090

91-
format = Logger.Formatter.compile Keyword.get(config, :format)
92-
level = Keyword.get(config, :level)
93-
metadata = Keyword.get(config, :metadata, [])
94-
colors = configure_colors(config)
91+
defp init(config, state) do
92+
level = Keyword.get(config, :level)
93+
device = Keyword.get(config, :device, :user)
94+
format = Logger.Formatter.compile Keyword.get(config, :format)
95+
colors = configure_colors(config)
96+
metadata = Keyword.get(config, :metadata, [])
9597
max_buffer = Keyword.get(config, :max_buffer, 32)
98+
9699
%{state | format: format, metadata: Enum.reverse(metadata),
97100
level: level, colors: colors, device: device, max_buffer: max_buffer}
98101
end
@@ -124,12 +127,12 @@ defmodule Logger.Backends.Console do
124127
%{state | buffer: buffer, buffer_size: buffer_size + 1}
125128
end
126129

127-
defp async_io(:user, output) do
128-
case Process.whereis(:user) do
130+
defp async_io(name, output) when is_atom(name) do
131+
case Process.whereis(name) do
129132
device when is_pid(device) ->
130133
async_io(device, output)
131134
nil ->
132-
raise "no device registered with the name :user"
135+
raise "no device registered with the name #{inspect name}"
133136
end
134137
end
135138

lib/logger/lib/logger/config.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ defmodule Logger.Config do
8181
def delete(@table) do
8282
:ets.delete(@table)
8383
end
84+
8485
## Callbacks
8586

8687
def init(_) do

lib/logger/test/logger/backends/console_test.exs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
defmodule Logger.Backends.ConsoleTest do
22
use Logger.Case
3+
34
require Logger
5+
import ExUnit.CaptureIO
46

57
setup do
68
on_exit fn ->
79
:ok = Logger.configure_backend(:console,
8-
[format: nil, level: nil, metadata: [], colors: [enabled: false]])
10+
[format: nil, device: :user, level: nil, metadata: [], colors: [enabled: false]])
911
end
1012
end
1113

@@ -24,6 +26,15 @@ defmodule Logger.Backends.ConsoleTest do
2426
{:ok, _} = Logger.add_backend(:console)
2527
end
2628

29+
test "may use another device" do
30+
Logger.configure_backend(:console, device: :standard_error)
31+
32+
assert capture_io(:standard_error, fn ->
33+
Logger.debug("hello")
34+
Logger.flush()
35+
end) =~ "hello"
36+
end
37+
2738
test "can configure format" do
2839
Logger.configure_backend(:console, format: "$message [$level]")
2940

0 commit comments

Comments
 (0)