gpt4 book ai didi

java - 使用 Gradle 运行 jUnit 测试时将 JUL 日志语句传递给 Log4j2

转载 作者:行者123 更新时间:2023-11-28 21:36:14 26 4
gpt4 key购买 nike

我有一个使用 JUL 日志记录的应用程序。我正在将它切换到 Log4j2,并且在使用 Gradle 运行 jUnit 测试时,我对日志记录的奇怪行为感到困惑。

示例简化示例:测试

import org.junit.Test;

import java.util.logging.LogManager;
import java.util.logging.Logger;

public class Test1
{
static
{
System.setProperty("java.util.logging.manager", org.apache.logging.log4j.jul.LogManager.class.getName());
}

private static final Logger LOG = Logger.getLogger("xxx");

@Test
public void test1()
{
System.out.println("----------------------------------------------------------------------------------------------------------");
System.out.println(LogManager.getLogManager().getClass().getName());
LOG.severe("-------------------- W O R K I N G --------------------");
System.out.println("----------------------------------------------------------------------------------------------------------");
}
}

log4j2.xml 放在资源文件夹中:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">

<Properties>
<Property name="loggingPattern">%date{YYYY-MM-dd HH:mm:ss.SSS} %maxLength{%-6level}{3} %12replace{%1MDC{mySession}}{\s+}{- } t%-5T %-40.40logger{1.1} %msg{nolookups}%n</Property>
</Properties>

<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${loggingPattern}"/>
</Console>
</Appenders>

<Loggers>
<Root level="WARN">
<AppenderRef ref="Console" level="ALL"/>
</Root>
</Loggers>
</Configuration>

构建.gradle

plugins {
id 'java'
}

group 'org.raqua'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
mavenCentral()
}

dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.12.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.12.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.12.1'

testCompile group: 'junit', name: 'junit', version: '4.12'
}

当我在 Idea(使用 Idea 自己的测试运行器)或 Eclipse 中运行测试时,我在控制台中打印了这个:

----------------------------------------------------------------------------------------------------------
org.apache.logging.log4j.jul.LogManager
2019-10-21 13:25:13.485 ERR - t1 xxx -------------------- W O R K I N G --------------------
----------------------------------------------------------------------------------------------------------

当我从 CLI 使用 Gradle 或使用 Gradle runner 使用 Idea 运行它时,我得到了这个:

Testing started at 1:26 PM ...
> Task :cleanTest
> Task :compileJava NO-SOURCE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test
----------------------------------------------------------------------------------------------------------
java.util.logging.LogManager
Oct 21, 2019 1:26:45 PM Test1 test1
SEVERE: -------------------- W O R K I N G --------------------
----------------------------------------------------------------------------------------------------------
BUILD SUCCESSFUL in 0s
4 actionable tasks: 2 executed, 2 up-to-date
1:26:45 PM: Tasks execution finished ':cleanTest :test --tests "Test1"'.

所以问题似乎是在使用 Gradle 时,加载了不正确的 LogManager - JUL,尽管在代码中明确告诉它我想要 Log4j 的 JUL 实现。如何说服 Gradle 使用 Log4j 记录器?

附言我更愿意将所有日志语句切换到 Log4j 并放弃 JUL,但不幸的是,目前这不是一个选项。

最佳答案

我已经通过将系统属性添加到 Gradle 测试配置来解决这个问题。

/* Logging configuration fot tests */
test {
testLogging {
showStandardStreams true
exceptionFormat "full"
}
// set logging manager for tests in order to use Log4j2 JUL implementation
systemProperty "java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"
}

关于java - 使用 Gradle 运行 jUnit 测试时将 JUL 日志语句传递给 Log4j2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58485376/

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