我试图在内部更改自定义异常的布局。要对此进行单元测试,我希望捕获控制台输出。我以前捕获过控制台输出,但我以前使用的方法在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!“。
如果我使用以下方法将其应用于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是静态的。有任何想法,为什么会发生这种情况,以及如何解决原来的问题,而不声明记录器这样做?
发布于 2013-06-03 07:37:34
System.setOut似乎是在log4j初始化之后被调用的。log4j使用System.out的值初始化(它将保留对它的引用)。正如您所说的,您可以通过在System.setOut之前调用log4j来绕过它。
对于静态记录器,它变得更难;您可以使用以下选项
-Dlog4j.defaultInitOverride=true这意味着log4j不会自动初始化,但是您仍然需要安排在第一个记录器之前调用System.setOut。
有关更多信息,请参阅log4j简介(节默认初始化过程)
https://stackoverflow.com/questions/16886023
复制相似问题