2017-12-27 475 views
0

我想知道如何在測試時禁用Elixir中的日誌記錄。在我當前的代碼中,我測試了記錄器消息,所以我不想完全禁用它,但隱藏消息,直到任何測試停止傳遞。測試時抑制記錄器

我使用mix和ExUnit來管理和測試我的項目。

mix test 
Compiling 2 files (.ex) 
......... 
17:59:18.446 [warn] Code seems to be empty 
. 
17:59:18.447 [warn] Code doesn't contain HLT opcode 
. 
17:59:18.448 [warn] Code doesn't contain HLT opcode 

17:59:18.448 [error] Label error doesn't exist 
..... 

Finished in 0.07 seconds 
16 tests, 0 failures 

回答

3

進入你的config/test.exs文件把下面的配置記錄程序:

config :logger, level: :error 

如果您還沒有具體的環境CONFIGS,把下面的行放在config/config.exs

config :logger, level: 
    case Mix.env do 
    :test -> :error 
    _ -> :info 
    end 

另一種選擇是使用另一後端爲日誌消息(假設{:logger_file_backend, "~> 0.0"}被包括在mix.exsdeps部分):

config :logger, 
    compile_time_purge_level: :debug, 
    format: "$date $time $metadata[$level] $message\n", 
    metadata: [:application, :module, :function, :file, :line], 
    backends: [{LoggerFileBackend, :info_warn_error}] 

config :logger, :info_warn_error, 
    path: "log/info_warn_error.log", # or "/dev/null" 
    level: :warn 
+0

我沒有提到,但我試過使用第一種方法,它保存了錯誤,加上基於警告的測試停止了傳遞。第二種方式或多或少是同一件事,所以我會嘗試添加自己的後端或者將它保留原樣。無論如何,謝謝你的回答。 – Jump3r

+0

只有具有路徑'/ dev/null'的後端纔會執行_exactly_您想要的操作:它將抑制任何輸出到任何地方(包括console),但它會使記錄器的gen_event服務器保持活動狀態,因此您可以測試任何您想要的內容。 _Sidenote:_我覺得你想要抑制錯誤很奇怪。 – mudasobwa

+0

嗯,我認爲這在開始測試錯誤時並不奇怪。如果你爲它編寫10-15個測試,看到這個預期會出現的所有錯誤消息變得非常煩人。 – Jump3r

0

我在記錄儀的文檔斑remove_backend()功能,所以在文件中使用 Logger.remove_backend(:console) 其中記錄程序後應該被禁用,每個記錄的消息都消失了(測試正在通過)。

編輯:我問Logger開發這個問題。顯然,最好在測試之上使用@moduletag :capture_log而不是刪除後端。無論如何,工作,對我來說很好。

+0

可能不是最好的主意。你正在刪除任何日誌 - 測試運行或其他。你可能不想這樣做。 –