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
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app?
Looking for hints regarding:
Addi...
New
Kia ora,
We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
Hi all, I wanted to ask how the community is dealing with post-release steps.
Today we have Ecto migrations, which make sure that the db...
New
Hello,
I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New
Other Trending Topics
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
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
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
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 10 of 14 Posts
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