wfgilman
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
Trending in Questions
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hello,
I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind.
However, when I launch mix phx.server, I get an error...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex











Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
josevalim
Can you please confirm how you are calling Logger.info? The API used in your example above is invalid and will raise an ArgumentError.
wfgilman
Oops, that was a type, now fixed. The test runs with the following result:
josevalim
Can you please provide a sample application that reproduces the error? Because for all intents and purposes it should just work.
wfgilman
Sure thing! Here’s my sample application: GitHub - wfgilman/log_capture_test: Example App Testing ExUnit.CaptureLog capture_log/2 assertion. · GitHub
There’s two tests to demonstrate: one for
warnand one forinfo. The first passes and the other does not.OvermindDL1
@wfgilman Have you looked at: log_capture_test/config/test.exs at master · wfgilman/log_capture_test · GitHub
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
It will not print anything, hence why it does not pass. ^.^
You need to adjust the test config to be
:infoinstead of:warnor so.wfgilman
Ah, yes I overlooked that. I updated the config and that test passed. Thanks for spotting that. By default,
capture_log/2is supposed to capture all logs, but I need to make sure the application is emitting all logs for that to workOvermindDL1
Lol, I’ve hit the exact same thing before. It is ‘interesting’ since the config completely eliminates the calls altogether once compiled.
jc00ke
I had this exact issue, changing to
level: :infoworked wonders.However, now my test output is really noisy. Any way to get the benefits of
warnwith respect to test output but still able to captureinfo?Am I reading this incorrectly? elixir/lib/ex_unit/lib/ex_unit/capture_log.ex at v1.7.4 · elixir-lang/elixir · GitHub
I would expect that, even if
config :logger, level: :warnis set, thatwould still capture, though that would seemingly contradict
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
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:
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