diff --git a/lib/tesla/middleware/logger.ex b/lib/tesla/middleware/logger.ex index 95dab3b5..f8c6374b 100644 --- a/lib/tesla/middleware/logger.ex +++ b/lib/tesla/middleware/logger.ex @@ -54,7 +54,7 @@ defmodule Tesla.Middleware.Logger do ## Options - - `:log_level` - custom function for calculating log level (see below) + - `:log_level` - custom option for calculating log level when get `{:ok, response}` after call.(see below) - `:filter_headers` - sanitizes sensitive headers before logging in debug mode (see below) - `:debug` - show detailed request/response logging @@ -81,7 +81,7 @@ defmodule Tesla.Middleware.Logger do - `:warn` - for 3xx responses - `:info` - for 2xx responses - You can customize this setting by providing your own `log_level/1` function: + You can customize this setting by providing your own `log_level/1` function when you get `{:ok, response}` after call: ``` defmodule MyClient do @@ -98,6 +98,19 @@ defmodule Tesla.Middleware.Logger do end ``` + In some cases, you can also provide the build-in level directly for customization: + + ``` + defmodule MyClient do + use Tesla + plug Tesla.Middleware.Logger, log_level: :debug + end + ``` + + NOTE: + - **If you get `{:error, whatever}`, the log_level will be `:error`.** + - You can get more log level information from [`Logger.Handler`](https://github.com/elixir-lang/elixir/blob/main/lib/logger/lib/logger/handler.ex) + ## Logger Debug output When the Elixir Logger log level is set to `:debug` diff --git a/test/tesla/middleware/logger_test.exs b/test/tesla/middleware/logger_test.exs index 9a2f89c6..3e17ba6c 100644 --- a/test/tesla/middleware/logger_test.exs +++ b/test/tesla/middleware/logger_test.exs @@ -167,6 +167,9 @@ defmodule Tesla.Middleware.LoggerTest do "/ok" -> {:ok, %{env | status: 200, body: "ok"}} + + "/specific_error" -> + {:error, "a specific error"} end end end @@ -185,6 +188,55 @@ defmodule Tesla.Middleware.LoggerTest do log = capture_log(fn -> ClientWithLogLevel.get("/ok") end) assert log =~ "[info] GET /ok -> 200" end + + test "specific error" do + log = capture_log(fn -> ClientWithLogLevel.get("/specific_error") end) + assert log =~ "[error] GET /specific_error -> error" + end + end + + describe "with log_level which provided build-in level directly" do + defmodule ClientWithLogLevelDirectly do + use Tesla + + plug Tesla.Middleware.Logger, log_level: :error + + adapter fn env -> + case env.url do + "/bad-request" -> + {:ok, %{env | status: 400, body: "bad request"}} + + "/not-found" -> + {:ok, %{env | status: 404, body: "not found"}} + + "/ok" -> + {:ok, %{env | status: 200, body: "ok"}} + + "/specific_error" -> + {:error, "a specific error"} + end + end + end + + test "not found" do + log = capture_log(fn -> ClientWithLogLevelDirectly.get("/not-found") end) + assert log =~ "[error] GET /not-found -> 404" + end + + test "bad request" do + log = capture_log(fn -> ClientWithLogLevelDirectly.get("/bad-request") end) + assert log =~ "[error] GET /bad-request -> 400" + end + + test "ok" do + log = capture_log(fn -> ClientWithLogLevelDirectly.get("/ok") end) + assert log =~ "[error] GET /ok -> 200" + end + + test "specific error" do + log = capture_log(fn -> ClientWithLogLevelDirectly.get("/specific_error") end) + assert log =~ "[error] GET /specific_error -> error" + end end describe "with filter_headers" do