gpt4 book ai didi

java - 单元测试 ConsoleAppender log4j

转载 作者:行者123 更新时间:2023-12-01 14:30:31 24 4
gpt4 key购买 nike

我正在尝试在内部更改自定义异常的布局。为了对此进行单元测试,我希望捕获控制台输出。我之前已经捕获过控制台输出,但是我之前使用的方法似乎没有使用 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,我看到:

The default target is System.out.

如果我更改代码以仅包含以下行:

   LOGGER.debug("Simple message");

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

2013-06-02 19:49:46,818 DEBUG [com.parlance.LoggingTest] - Simple message

所以我假设这会起作用,但显然错过了一些东西并且一直让我摸不着头脑!

更新

我刚刚尝试了一些方法,如果我将记录器类的创建更改为在调用 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 保持静态,效果就不太好。有什么想法为什么会发生这种情况以及如何在不以这种方式声明记录器的情况下解决原始问题吗?

最佳答案

看起来System.setOut是在log4j初始化之后被调用的。 log4j 使用 System.out 的值进行初始化(它将保留对其的引用)。正如您所说,您可以通过在 log4j 之前调用 System.setOut 来解决这个问题。

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

-Dlog4j.defaultInitOverride=true

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

有关详细信息,请参阅Short introduction to log4j (section Default Initialization Procedure)

关于java - 单元测试 ConsoleAppender log4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16886023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com