- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在内部更改自定义异常的布局。为了对此进行单元测试,我希望捕获控制台输出。我之前已经捕获过控制台输出,但是我之前使用的方法似乎没有使用 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/
我正在尝试在内部更改自定义异常的布局。为了对此进行单元测试,我希望捕获控制台输出。我之前已经捕获过控制台输出,但是我之前使用的方法似乎没有使用 log4j 获得预期的结果。 如果我想捕获控制台输出,我
我想知道是否有人碰巧有使用 Log4js 的经验?看起来很正常 ConsoleAppender在将其添加到记录器对象后并不总是可以立即使用...如果我在文档中有两个连续的脚本标签,例如: //Init
我正在运行 Tomcat 8.0.9 并使用 log4j2。我在控制台附加器上定义了一个模式布局,并将其设置为 SYSTEM_OUT。布局模式类似于: %d{yyyy-MM-dd} %m%n 但是当调
我正在尝试在 slf4j 中设置一个带有 logback 的控制台记录器。我的logback配置如下: %-4relative [%thread] %-5level
我想以编程方式创建一个新的 log4j ConsoleAppender 并将其作为 appender 添加到记录器 - 我该如何正确实例化一个 - 使用以下内容似乎会使 log4j 提示 - 我需要使
我看到我们的一个工具在其 log4j 配置中的 System.out 旁边使用 ConsoleAppender 来处理 System.err。配置片段: ...
我编写了一个简单的程序,其中使用了Logback。我的目的是使用 ASYNS,它在内部将使用 STDOUT。 这是 Java 代码 list : package com.example; import
我想使用 ConsoleAppender 配置 Logback 以使用 stderr,而不是 stdout。特别是,我想使用纯代码而不是properties/xml 文件来完成此操作。这是我的尝试。关
我有 log4j 属性 (log4j v1.2.16) 文件,我在其中使用了 RollingFileAppender和ConsoleAppender . RollingFileAppender的配置如
我们使用的是 Log4j v1.2.14。我们已经在使用 org.apache.log4j.ConsoleAppender现在我们有一个要求/需要有每日轮换日志。因此,我们计划使用 org.apach
我有一个 java 类,它在启动时基于 javassist 类加载器创建自定义类加载器,然后运行真正的程序类。我收到以下错误: log4j:ERROR A "org.apache.log4j.Cons
使用 log4j,如果 FileAppender 在写入指定日志文件时出现问题,我想恢复到 ConsoleAppender。这意味着捕获 FileNotFoundException 或 IOExcep
我无法让 Athena JDBC 驱动程序正确登录。我更喜欢 SL4J SimpleLogger,但似乎不支持这个工厂,但只支持 Log4J(只是写这个以防你想知道为什么有 2 个日志框架)。不幸的是
我正在使用 Spring Boot 构建命令行应用程序。在这样的应用程序中,logback 控制台日志记录是不合适的。如何完全禁用控制台附加程序,但仍然让文件附加程序与 default Spring
在 App.Config 中,我为我的控制台应用程序声明了一个配置部分: 并配置一个ConsoleAppender :
我已经使用 ConsoleAppender 在 log4j 记录器上创建了一个记录器。代码如下, public class AppLogger{ static { Console
我的要求是将消息记录到 3 个单独的日志文件中。 我在 JBOSS 服务器中使用 3 个附加程序。 其中三个需要按如下方式工作1.RollingFileAppender、consoleAppender
从 Jboss 5 升级到 Jboss EAP 6.3.0 后,我们发现一个应用程序在运行一段时间后失败。看了一下,接受 HTTP 请求但无法为其提供服务的线程数量开始增加。之后,ThreadDump
当我在 logger.Warn 下面做任何事情时,我想写信给 Console.Out 然后我想写信给 Console.Err 当我记录任何 logger.Error 及以上的内容时。我将如何编写我的
我在使用 log4j ConsoleAppender 时遇到问题: 如果我这样初始化它: ConsoleAppender ca = new ConsoleAppender(); ca.setLayou
我是一名优秀的程序员,十分优秀!