首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试ConsoleAppender log4j

单元测试ConsoleAppender log4j
EN

Stack Overflow用户
提问于 2013-06-02 18:39:42
回答 1查看 1.4K关注 0票数 0

我试图在内部更改自定义异常的布局。要对此进行单元测试,我希望捕获控制台输出。我以前捕获过控制台输出,但我以前使用的方法在log4j中似乎没有预期的结果。

如果我想捕获控制台输出,我会使用:

代码语言:javascript
复制
    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:

代码语言:javascript
复制
    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。

如果我将代码更改为只包含以下一行:

代码语言:javascript
复制
   LOGGER.debug("Simple message");

我在控制台中看到了预期的结果:

2013-06-02 19:49:46,818调试com.parlance.LoggingTest -简单消息

所以,我以为这会起作用,但显然错过了一些东西,让我挠头!

更新

我只是尝试了一种方法,如果我在调用System.setOut之后将日志记录器类的创建更改为“之后”,那么它似乎是有效的:

代码语言:javascript
复制
  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是静态的。有任何想法,为什么会发生这种情况,以及如何解决原来的问题,而不声明记录器这样做?

EN

回答 1

Stack Overflow用户

发布于 2013-06-03 07:37:34

System.setOut似乎是在log4j初始化之后被调用的。log4j使用System.out的值初始化(它将保留对它的引用)。正如您所说的,您可以通过在System.setOut之前调用log4j来绕过它。

对于静态记录器,它变得更难;您可以使用以下选项

代码语言:javascript
复制
-Dlog4j.defaultInitOverride=true

这意味着log4j不会自动初始化,但是您仍然需要安排在第一个记录器之前调用System.setOut

有关更多信息,请参阅log4j简介(节默认初始化过程)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16886023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档