How to remove logs from `mix test`

Background

I have a considerable test suite for my app with unit tests and integrated tests. The application has a considerable size so it has quite a number of Logger.debug, Logger.info and Logger.error calls spread around everywhere.

Objective

This means that when I run mix test my output gets polluted with hundreds of lines of logs. I need these logs so removing them from production code is not really an option, but I would like to hide them when testing.

Problem

To achieve this I changed my test_helper.exs to have the following content:

ExUnit.start(capture_log: true)

However when I run mix test I see a ton of l debug and even info logs.

Questions

How can I hide all logs from showing when running mix test ?

1 Like

The test config (config/test.exs) generated by mix phx.new has this.

# Print only warnings and errors during test
config :logger, level: :warn
3 Likes

I don’t even want those because since I am (also) testing for errors the Logger.error calls will still pollute my output. I am picky :stuck_out_tongue:

config :logger, backends: [] will disable logging. You can find all the options here https://hexdocs.pm/logger/Logger.html

5 Likes

for other kinds of outputs, capture_io/1 might help cleanup test output: https://hexdocs.pm/ex_unit/ExUnit.CaptureIO.html

1 Like

When testing for errors, you can use ExUnit.CaptureLog to capture log messages (which then won’t appear in the output).

In general, I wouldn’t advise muting errors in tests, since they might be indicative of why some tests are failing.

4 Likes

This is … a good point. I have changed my config to the following:

# Print only warnings and errors during test
config :logger, level: :warn

As @jola suggested. This should do it, even though I may see some logs I don’t want to, I think the compromise is fair.

1 Like

You can use only in the test that triggers Log output the @moduletag directive:

@moduletag :capture_log
test "Test that trigger log output..." do
  ...
end
1 Like