wfgilman
ExUnit.CaptureLog assert capture_log/2 not capturing level "info"
I’m testing my rate limiting plug and I want to make sure the plug logs an rate limit violations. However, I want this log to be at level :info. The assertion works when I log it at level :error or :warn, but not at :info. I tried setting the options in capture_log/2 but it didn’t have any effect. Am I missing something?
Test
test "rate_limit/2 puts 429 status if rate limit is exceeded", %{conn: conn, opts: opts} do
breach = opts[:max_requests] + 1
for req <- 1..breach do
if req == breach do
assert capture_log([level: :info], fn ->
conn = Api.RateLimit.rate_limit(conn, opts)
assert conn.status == 429
end) =~ "Rate limit violation for bucket"
else
Api.RateLimit.rate_limit(conn, opts)
end
end
end
Function
def rate_limit(conn, opts) do
case check_rate(conn, opts) do
{:ok, _count} ->
conn
{:error, _count} ->
Logger.info(fn ->
bucket = opts[:bucket_name] || default_bucket_name(conn)
"Rate limit violation for bucket: #{inspect bucket}"
end)
render_error(conn)
end
end
Marked As Solved
OvermindDL1
@wfgilman Have you looked at: log_capture_test/config/test.exs at master · wfgilman/log_capture_test · GitHub
# Print only warnings and errors during test
config :logger, level: :warn
And considering the test that is not passing runs this code: log_capture_test/lib/log_capture/rate_limit.ex at master · wfgilman/log_capture_test · GitHub
def rate_limit(conn, _opts) do
Logger.info(fn -> "Rate limit violation" end)
conn
end
It will not print anything, hence why it does not pass. ^.^
You need to adjust the test config to be :info instead of :warn or so.
Also Liked
eteeselink
At the risk of terrible necroposting and of stating the obvious: I ran into this same problem and saw that the OP’s last remarks went unanswered. I found a solution, so maybe other googlers are helped by this:
Our test.exs had
config :logger,
level: :warn
and only by setting it to :info I could get my capture_log assertions to capture the relevant logs.
However, it totally polluted the test output. As described, setting the log level to :warn actually removes the :debug and :info level log statements from the compiled code entirely.
Fortunately, there’s a way around this:
# capture all logs...
config :logger,
level: :debug
# ... but show only warnings and up on the console
config :logger, :console,
level: :warn
This works because Logger’s default backend, console, can be separately configured to filter log levels. That way the Logger.info calls etc are not removed from the code, but the console output is still sane.
I found it all to be documented pretty well in the Logger docs btw: Logger — Logger v1.20.2
jc00ke
Best. Necropost. Ever.
I must have missed it, so thank you for stating the obvious!
My logs are now much less noisy ![]()
jc00ke
I had this exact issue, changing to level: :info worked wonders.
However, now my test output is really noisy. Any way to get the benefits of warn with respect to test output but still able to capture info?
Am I reading this incorrectly? elixir/lib/ex_unit/lib/ex_unit/capture_log.ex at v1.7.4 · elixir-lang/elixir · GitHub
It is possible to configure the level to capture with
:level, which will set the capturing level for the duration of the capture, for instance, if the log level is set to :error any message with the lower level will be ignored. The default level isnil, which will capture all messages. The behaviour is undetermined if async tests change Logger level.
I would expect that, even if config :logger, level: :warn is set, that
capture_log([level: :info], fn ->
Logger.info "..."
end)
would still capture, though that would seemingly contradict
The
Logger.info/2macro emits the provided message at the:infolevel. Note the arguments given toinfo/2will only be evaluated if a message is logged. For instance, if the Logger level is set to:warn,:infomessages are never logged and therefore the arguments given above won’t even be executed.
Last Post!
ityonemo
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









