@@ -76,7 +76,8 @@ defmodule Tesla.Middleware.Logger do
7676
7777 ## Options
7878
79- - `:log_level` - custom function for calculating log level (see below)
79+ - `:level` - custom function for calculating log level or atom for fixed level (see below)
80+ - `:log_level` - (deprecated) custom function for calculating log level (see below)
8081 - `:filter_headers` - sanitizes sensitive headers before logging in debug mode (see below)
8182 - `:debug` - use `Logger.debug/2` to log request/response details
8283 - `:format` - custom string template or function for log message (see below)
@@ -120,7 +121,43 @@ defmodule Tesla.Middleware.Logger do
120121 - `:warn` or `:warning` - for 3xx responses
121122 - `:info` - for 2xx responses
122123
123- You can customize this setting by providing your own `log_level/1` function:
124+ You can customize this setting by providing your own level function that accepts
125+ both success and error cases:
126+
127+ ```elixir
128+ defmodule MyClient do
129+ def client do
130+ Tesla.client([
131+ {Tesla.Middleware.Logger, level: &my_level/1}
132+ ])
133+ end
134+
135+ def my_level({:ok, env}) do
136+ case env.status do
137+ 404 -> :info
138+ _ -> :default
139+ end
140+ end
141+
142+ def my_level({:error, _reason}) do
143+ :error
144+ end
145+ end
146+ ```
147+
148+ Or provide a fixed log level:
149+
150+ ```elixir
151+ defmodule MyClient do
152+ def client do
153+ Tesla.client([
154+ {Tesla.Middleware.Logger, level: :debug}
155+ ])
156+ end
157+ end
158+ ```
159+
160+ You can also use the deprecated `log_level` option (will show a deprecation warning):
124161
125162 ```elixir
126163 defmodule MyClient do
@@ -139,6 +176,13 @@ defmodule Tesla.Middleware.Logger do
139176 end
140177 ```
141178
179+ To disable the deprecation warning for `:log_level`, add this to your config:
180+
181+ ```elixir
182+ # config/config.exs
183+ config :tesla, disable_log_level_warning: true
184+ ```
185+
142186 ## Logger Debug output
143187
144188 `Tesla` will use `Logger.debug/2` to log request & response details using
@@ -233,28 +277,54 @@ defmodule Tesla.Middleware.Logger do
233277 response
234278 end
235279
236- defp log_level ( { :error , _ } , _ ) , do: :error
280+ defp log_level ( response , config ) do
281+ log_level_option = Keyword . get ( config , :log_level )
282+ level_option = Keyword . get ( config , :level )
283+
284+ cond do
285+ log_level_option != nil and level_option != nil ->
286+ raise ArgumentError , "cannot provide both :log_level and :level options"
287+
288+ log_level_option != nil ->
289+ IO . warn ( ":log_level option is deprecated, use :level option instead" )
290+
291+ apply_level_function ( response , & legacy_log_level_wrapper ( log_level_option , & 1 ) )
237292
238- defp log_level ( { :ok , env } , config ) do
239- case Keyword . get ( config , :log_level ) do
240- nil ->
241- default_log_level ( env )
293+ level_option != nil ->
294+ apply_level_function ( response , level_option )
242295
243- fun when is_function ( fun ) ->
244- case fun . ( env ) do
245- :default -> default_log_level ( env )
246- warning when warning in [ :warn , :warning ] -> @ warning_level
247- level -> level
248- end
296+ true ->
297+ default_response_log_level ( response )
298+ end
299+ end
249300
250- warning when warning in [ :warn , :warning ] ->
251- @ warning_level
301+ defp apply_level_function ( response , fun ) when is_function ( fun ) do
302+ case fun . ( response ) do
303+ :default -> default_response_log_level ( response )
304+ warning when warning in [ :warn , :warning ] -> @ warning_level
305+ level -> level
306+ end
307+ end
252308
253- atom when is_atom ( atom ) ->
254- atom
309+ defp apply_level_function ( _response , atom ) when is_atom ( atom ) do
310+ case atom do
311+ warning when warning in [ :warn , :warning ] -> @ warning_level
312+ level -> level
255313 end
256314 end
257315
316+ # Wrapper function to adapt old log_level functions to the new response tuple format
317+ defp legacy_log_level_wrapper ( log_level_function , { :ok , env } ) do
318+ log_level_function . ( env )
319+ end
320+
321+ defp legacy_log_level_wrapper ( _log_level_function , { :error , _ } ) do
322+ :error
323+ end
324+
325+ defp default_response_log_level ( { :error , _ } ) , do: :error
326+ defp default_response_log_level ( { :ok , env } ) , do: default_log_level ( env )
327+
258328 @ spec default_log_level ( Tesla.Env . t ( ) ) :: log_level
259329 def default_log_level ( env ) do
260330 cond do
0 commit comments