java - 在 JUnit 测试中使用 Maven 时通过 log4j2 获取 JUL 日志
问题描述
我正在运行一个小测试项目,我希望我的 JUL 日志被重定向并显示为 log4j2 日志。我正在使用以下 Maven 依赖项:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jul</artifactId>
<version>2.13.3</version>
</dependency>
要使用 log4j-jul 适配器,我应该将系统属性设置java.util.logging.manager
为org.apache.logging.log4j.jul.LogManager
. 当我在我的项目的主要方法中这样做时
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
然后记录按需要工作。但是,如果我使用 JUnit 测试(使用 mvn 测试运行)执行相同的操作,例如
@Test
public void loggingJULTest() {
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger(MainTest.class.getName());
julLogger.info("Info Message from JUL");
julLogger.severe("Severe message from JUL");
julLogger.fine("Fine message from JUL");
}
然后日志以 JUL 样式显示。我尝试在 pom.xml 中将以下配置添加到 Maven 的 Surefire 插件中
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.apache.logging.log4j.jul.LogManager</java.util.logging.manager>
<buildDirectory>${project.build.directory}</buildDirectory>
</systemPropertyVariables>
</configuration>
但随后测试没有输出并显示警告
[WARNING] Corrupted STDOUT by directly writing to native stream in forked JVM 1. See FAQ web page and the dump file[..]
我对我应该在这里做什么感到困惑。
解决方案
如果您使用的是3.0.0-M5
的版本,则maven-surefire-plugin
需要添加<forkNode implementation="org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory"/>
到configuration
.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
<configuration>
<forkNode implementation="org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory"/>
...
</configuration>
</plugin>
</plugins>
</build>
PS:以后有类似问题,请补充Java和Maven的版本信息。
推荐阅读
- python - 使用 Date 对象更新集合(百万+)中的所有文档
- c# - 从旋转矩阵转换为四元数时,不确定如何防止 270 度与 90 度混淆
- angular - 键盘隐藏输入 - Ionic 5
- arrays - 加载输入帮助 getline 并使用 sscanf
- android - 使用用户 ID 从 Firebase 获取数据
- javascript - Mongo DB 错误:未知的顶级运算符:$set; 如何更新此记录?
- java - 如何在 Spring Boot 中更新子实体和父实体?
- mqtt - 使用 Mosquitto 跨设备设置 CA 授权和 TLS
- android - 用户输入后 TextField 值未更新
- python - 制作新网址/查看 Django 时找不到页面