[英]Unit testing ConsoleAppender log4j
我正在嘗試在內部更改自定義異常的布局。 為了對此進行單元測試,我希望捕獲控制台輸出。 我之前已經捕獲了控制台輸出,但是以前使用的方法似乎與log4j並沒有達到預期的結果。
如果要捕獲控制台輸出,請使用:
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream printStream = new PrintStream(baos);
System.setOut(printStream);
System.out.println("Hello world!");
final String consoleOutput = baos.toString();
然后,consoleOutput的值為“ Hello World!”。
如果我使用以下命令將其應用於log4j:
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream printStream = new PrintStream(baos);
System.setOut(printStream);
LOGGER.debug("Simple message");
final String consoleOutput = baos.toString();
consoleOutput為空。 查看用於ConsoleAppender的javadoc,我看到:
默認目標是System.out。
如果我將代碼更改為僅包含以下行:
LOGGER.debug("Simple message");
我在控制台中看到了預期的結果:
2013-06-02 19:49:46,818調試[com.parlance.LoggingTest]-簡單消息
所以我以為這是可行的,但顯然錯過了一些東西,任由我撓頭!
更新
我只是嘗試了一下,如果我將記錄器類的創建更改為在我調用System.setOut之后,它似乎可以工作:
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final PrintStream printStream = new PrintStream(baos);
System.setOut(printStream);
final Logger logger = Logger.getLogger(LoggingTest.class);
logger.debug("Simple message");
final String consoleOutput = baos.toString();
這具有所需的效果,但是如果我想使Logger保持靜態,那不是很好。 有什么想法為什么會發生這種情況以及如何在不以這種方式聲明記錄器的情況下解決原始問題?
似乎在初始化log4j之后調用了System.setOut
。 log4j使用System.out
的值進行初始化(它將保留對其的引用)。 您可以通過在log4j之前調用System.setOut
來解決該問題。
對於靜態記錄器而言,它變得越來越難。 您可以使用該選項
-Dlog4j.defaultInitOverride=true
這意味着log4j不會自動初始化,但是您仍然需要安排在第一個記錄器之前調用System.setOut
。
有關更多信息,請參見log4j簡介(默認初始化過程部分)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.