Skip to content

Commit 460361d

Browse files
committed
feat: add url policy to logger middleware
1 parent 649497f commit 460361d

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

lib/tesla/middleware/logger.ex

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,42 @@ defmodule Tesla.Middleware.Logger.Formatter do
2929
Tesla.Env.t(),
3030
Tesla.Env.result(),
3131
integer,
32-
format | function | {module, atom}
32+
format | function | {module, atom},
33+
keyword
3334
) :: IO.chardata()
34-
def format(request, response, time, fun) when is_function(fun) do
35+
def format(request, response, time, fun, _opts) when is_function(fun) do
3536
apply(fun, [request, response, time])
3637
end
3738

38-
def format(request, response, time, {mod, fun}) do
39+
def format(request, response, time, {mod, fun}, _opts) do
3940
apply(mod, fun, [request, response, time])
4041
end
4142

42-
def format(request, response, time, format) do
43-
Enum.map(format, &output(&1, request, response, time))
43+
def format(request, response, time, format, opts) do
44+
Enum.map(format, &output(&1, request, response, time, opts))
4445
end
4546

46-
defp output(:query, env, _, _) do
47+
defp output(:query, env, _response, _time, _opts) do
4748
encoding = Keyword.get(env.opts, :query_encoding, :www_form)
4849

4950
Tesla.encode_query(env.query, encoding)
5051
end
5152

52-
defp output(:method, env, _, _), do: env.method |> to_string() |> String.upcase()
53-
defp output(:url, env, _, _), do: env.url
54-
defp output(:status, _, {:ok, env}, _), do: to_string(env.status)
55-
defp output(:status, _, {:error, reason}, _), do: "error: " <> inspect(reason)
56-
defp output(:time, _, _, time), do: :io_lib.format("~.3f", [time / 1000])
57-
defp output(binary, _, _, _), do: binary
53+
defp output(:method, env, _resp, _time, _opts), do: env.method |> to_string() |> String.upcase()
54+
defp output(:url, env, _resp, _time, opts) do
55+
req_url = env.opts[:req_url]
56+
url_display = opts[:url_display] || :raw
57+
58+
case {url_display, req_url} do
59+
{:raw, _} -> env.url
60+
{:template, nil} -> env.url
61+
{:template, req_url} -> req_url
62+
end
63+
end
64+
defp output(:status, _req, {:ok, env}, _time, _opts), do: to_string(env.status)
65+
defp output(:status, _req, {:error, reason}, _time, _opts), do: "error: " <> inspect(reason)
66+
defp output(:time, _req, _resp, time, _opts), do: :io_lib.format("~.3f", [time / 1000])
67+
defp output(binary, _req, _resp, _time, _opts), do: binary
5868
end
5969

6070
defmodule Tesla.Middleware.Logger do
@@ -80,6 +90,9 @@ defmodule Tesla.Middleware.Logger do
8090
- `:filter_headers` - sanitizes sensitive headers before logging in debug mode (see below)
8191
- `:debug` - use `Logger.debug/2` to log request/response details
8292
- `:format` - custom string template or function for log message (see below)
93+
- `:url_display` - how to display the URL in the log message
94+
- `:raw` - use the raw URL (default)
95+
- `:template` - use the template URL (requires `Tesla.Middleware.KeepRequest` and `Tesla.Middleware.PathParams` middleware)
8396
8497
## Custom log format
8598
@@ -224,7 +237,7 @@ defmodule Tesla.Middleware.Logger do
224237
if optional_runtime_format, do: Formatter.compile(optional_runtime_format), else: @format
225238

226239
level = log_level(response, config)
227-
Logger.log(level, fn -> Formatter.format(env, response, time, format) end)
240+
Logger.log(level, fn -> Formatter.format(env, response, time, format, opts) end)
228241

229242
if Keyword.get(config, :debug, true) do
230243
Logger.debug(fn -> debug(env, response, config) end)

0 commit comments

Comments
 (0)